From c465fd16f57bb665a72aa30ccb5317f879940fcd Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 2 Dec 2024 10:45:29 +0100 Subject: [PATCH 01/99] add json lines --- technology/files/JSON Lines.md | 84 ++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 technology/files/JSON Lines.md diff --git a/technology/files/JSON Lines.md b/technology/files/JSON Lines.md new file mode 100644 index 0000000..3a05508 --- /dev/null +++ b/technology/files/JSON Lines.md @@ -0,0 +1,84 @@ +--- +obj: format +website: https://jsonlines.org +extension: "jsonl" +mime: "application/jsonl" +rev: 2024-12-02 +--- + +# JSON Lines +This page describes the JSON Lines text format, also called newline-delimited JSON. JSON Lines is a convenient format for storing structured data that may be processed one record at a time. It works well with unix-style text processing tools and shell pipelines. It's a great format for log files. It's also a flexible format for passing messages between cooperating processes. + +The JSON Lines format has three requirements: +- **UTF-8 Encoding**: JSON allows encoding Unicode strings with only ASCII escape sequences, however those escapes will be hard to read when viewed in a text editor. The author of the JSON Lines file may choose to escape characters to work with plain ASCII files. Encodings other than UTF-8 are very unlikely to be valid when decoded as UTF-8 so the chance of accidentally misinterpreting characters in JSON Lines files is low. +- **Each Line is a Valid JSON Value**: The most common values will be objects or arrays, but any JSON value is permitted. +- **Line Separator is `\n`**: This means `\r\n` is also supported because surrounding white space is implicitly ignored when parsing JSON values. + +## Better than CSV +```json +["Name", "Session", "Score", "Completed"] +["Gilbert", "2013", 24, true] +["Alexa", "2013", 29, true] +["May", "2012B", 14, false] +["Deloise", "2012A", 19, true] +``` + +CSV seems so easy that many programmers have written code to generate it themselves, and almost every implementation is different. Handling broken CSV files is a common and frustrating task. CSV has no standard encoding, no standard column separator and multiple character escaping standards. String is the only type supported for cell values, so some programs attempt to guess the correct types. + +JSON Lines handles tabular data cleanly and without ambiguity. Cells may use the standard JSON types. + +The biggest missing piece is an import/export filter for popular spreadsheet programs so that non-programmers can use this format. + +## Self-describing data +```json +{"name": "Gilbert", "session": "2013", "score": 24, "completed": true} +{"name": "Alexa", "session": "2013", "score": 29, "completed": true} +{"name": "May", "session": "2012B", "score": 14, "completed": false} +{"name": "Deloise", "session": "2012A", "score": 19, "completed": true} +``` + +JSON Lines enables applications to read objects line-by-line, with each line fully describing a JSON object. The example above contains the same data as the tabular example above, but allows applications to split files on newline boundaries for parallel loading, and eliminates any ambiguity if fields are omitted or re-ordered. + +## Easy Nested Data +```json +{"name": "Gilbert", "wins": [["straight", "7♣"], ["one pair", "10♥"]]} +{"name": "Alexa", "wins": [["two pair", "4♠"], ["two pair", "9♠"]]} +{"name": "May", "wins": []} +{"name": "Deloise", "wins": [["three of a kind", "5♣"]]} +``` + +JSON Lines' biggest strength is in handling lots of similar nested data structures. One `.jsonl` file is easier to work with than a directory full of XML files. + +If you have large nested structures then reading the JSON Lines text directly isn't recommended. Use the "jq" tool to make viewing large structures easier: + +``` +grep pair winning_hands.jsonl | jq . + +{ + "name": "Gilbert", + "wins": [ + [ + "straight", + "7♣" + ], + [ + "one pair", + "10♥" + ] + ] +} +{ + "name": "Alexa", + "wins": [ + [ + "two pair", + "4♠" + ], + [ + "two pair", + "9♠" + ] + ] +} +``` + \ No newline at end of file From b0b8cf4428223d2e15b4c4944327316b49c888cd Mon Sep 17 00:00:00 2001 From: JMARyA Date: Tue, 3 Dec 2024 10:31:42 +0100 Subject: [PATCH 02/99] add woodpecker ci --- technology/applications/Applications.md | 1 + technology/applications/web/WoodpeckerCI.md | 1720 +++++++++++++++++++ 2 files changed, 1721 insertions(+) create mode 100644 technology/applications/web/WoodpeckerCI.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index e384cdc..0cec095 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -139,6 +139,7 @@ rev: 2024-07-14 - [AdGuard](./web/AdGuard.md) - [Gitea](./web/Gitea.md) - [Forgejo](./web/Forgejo.md) +- [Woodpecker CI](./web/WoodpeckerCI.md) - [SearXNG](./web/Searxng.md) - [Grocy](./web/Grocy.md) - [Guacamole](./web/Guacamole.md) diff --git a/technology/applications/web/WoodpeckerCI.md b/technology/applications/web/WoodpeckerCI.md new file mode 100644 index 0000000..9aa6f41 --- /dev/null +++ b/technology/applications/web/WoodpeckerCI.md @@ -0,0 +1,1720 @@ +--- +obj: application +website: https://woodpecker-ci.org +repo: https://github.com/woodpecker-ci/woodpecker +rev: 2024-12-03 +--- + +# Woodpecker CI +Woodpecker is a simple, yet powerful CI/CD engine with great extensibility. + +## Workflow Syntax +The Workflow section defines a list of steps to build, test and deploy your code. The steps are executed serially in the order in which they are defined. If a step returns a non-zero exit code, the workflow and therefore the entire pipeline terminates immediately and returns an error status. + +Example steps: + +```yml +steps: + - name: backend + image: golang + commands: + - go build + - go test + - name: frontend + image: node + commands: + - npm install + - npm run test + - npm run build +``` + +In the above example we define two steps, frontend and backend. The names of these steps are completely arbitrary. + +The name is optional, if not added the steps will be numerated. + +Another way to name a step is by using dictionaries: + +```yml +steps: + backend: + image: golang + commands: + - go build + - go test + frontend: + image: node + commands: + - npm install + - npm run test + - npm run build +``` + +### Skip Commits +Woodpecker gives the ability to skip individual commits by adding `[SKIP CI]` or `[CI SKIP]` to the commit message. Note this is case-insensitive. + +```shell +git commit -m "updated README [CI SKIP]" +``` + +### Steps +Every step of your workflow executes commands inside a specified container. +The defined steps are executed in sequence by default, if they should run in parallel you can use `depends_on`. +The associated commit is checked out with git to a workspace which is mounted to every step of the workflow as the working directory. + +```yml + steps: + - name: backend + image: golang + commands: ++ - go build ++ - go test +``` + +File changes are incremental +Woodpecker clones the source code in the beginning of the workflow +Changes to files are persisted through steps as the same volume is mounted to all steps + +```yml +steps: + - name: build + image: debian + commands: + - echo "test content" > myfile + - name: a-test-step + image: debian + commands: + - cat myfile +``` + +### `image` +Woodpecker pulls the defined image and uses it as environment to execute the workflow step commands, for plugins and for service containers. + +When using the local backend, the image entry is used to specify the shell, such as Bash or Fish, that is used to run the commands. + +```yml + steps: + - name: build ++ image: golang:1.6 + commands: + - go build + - go test + + - name: publish ++ image: plugins/docker + repo: foo/bar + + services: + - name: database ++ image: mysql +``` + +Woodpecker supports any valid Docker image from any Docker registry. + +Woodpecker does not automatically upgrade container images. Example configuration to always pull the latest image when updates are available: + +```yml + steps: + - name: build + image: golang:latest ++ pull: true +``` + +### `commands` +Commands of every step are executed serially as if you would enter them into your local shell. + +```yml + steps: + - name: backend + image: golang + commands: ++ - go build ++ - go test +``` + +There is no magic here. The above commands are converted to a simple shell script. + +Only build steps can define commands. You cannot use commands with plugins or services. + +### entrypoint +Allows you to specify the entrypoint for containers. Note that this must be a list of the command and its arguments (e.g. `["/bin/sh", "-c"]`). + +If you define commands, the default entrypoint will be `["/bin/sh", "-c", "echo $CI_SCRIPT | base64 -d | /bin/sh -e"]`. You can also use a custom shell with `CI_SCRIPT` (Base64-encoded) if you set commands. + +### `environment` +Woodpecker provides the ability to pass environment variables to individual steps. + +For more details, check the environment docs. + +### `secrets` +Woodpecker provides the ability to store named parameters external to the YAML configuration file, in a central secret store. These secrets can be passed to individual steps of the workflow at runtime. + +For more details, check the secrets docs. + +### `failure` +Some of the steps may be allowed to fail without causing the whole workflow and therefore pipeline to report a failure (e.g., a step executing a linting check). To enable this, add `failure: ignore` to your step. If Woodpecker encounters an error while executing the step, it will report it as failed but still executes the next steps of the workflow, if any, without affecting the status of the workflow. + +```yml + steps: + - name: backend + image: golang + commands: + - go build + - go test ++ failure: ignore +``` + +### `when` - Conditional Execution +Woodpecker supports defining a list of conditions for a step by using a when block. If at least one of the conditions in the when block evaluate to true the step is executed, otherwise it is skipped. A condition is evaluated to true if all subconditions are true. A condition can be a check like: + +```yml + steps: + - name: slack + image: plugins/slack + settings: + channel: dev ++ when: ++ - event: pull_request ++ repo: test/test ++ - event: push ++ branch: main +``` + +The slack step is executed if one of these conditions is met: + +- The pipeline is executed from a pull request in the repo test/test +- The pipeline is executed from a push to maiǹ + +#### `repo` +Example conditional execution by repository: + +```yml + steps: + - name: slack + image: plugins/slack + settings: + channel: dev ++ when: ++ - repo: test/test +``` + +#### `branch` +Branch conditions are not applied to tags. + +Example conditional execution by branch: + +```yml + steps: + - name: slack + image: plugins/slack + settings: + channel: dev ++ when: ++ - branch: main +``` + +The step now triggers on main branch, but also if the target branch of a pull request is main. Add an event condition to limit it further to pushes on main only. + +Execute a step if the branch is main or develop: + +```yml +when: + - branch: [main, develop] +``` + +Execute a step if the branch starts with prefix/*: + +```yml +when: + - branch: prefix/* +``` + +The branch matching is done using doublestar, note that a pattern starting with `*` should be put between quotes and a literal `/` needs to be escaped. A few examples: + +Execute a step using custom include and exclude logic: + +```yml +when: + - branch: + include: [main, release/*] + exclude: [release/1.0.0, release/1.1.*] +``` + +#### `event` +Available events: `push`, `pull_request`, `pull_request_closed`, `tag`, `release`, `deployment`, `cron`, `manual` + +Execute a step if the build event is a tag: + +```yml +when: + - event: tag +``` + +Execute a step if the pipeline event is a push to a specified branch: + +```yml +when: + - event: push ++ branch: main +``` + +Execute a step for multiple events: + +```yml +when: + - event: [push, tag, deployment] +``` + +#### `cron` +This filter only applies to cron events and filters based on the name of a cron job. + +Make sure to have a event: cron condition in the when-filters as well. + +```yml +when: + - event: cron + cron: sync_* # name of your cron job +``` + +#### `ref` +The ref filter compares the git reference against which the workflow is executed. This allows you to filter, for example, tags that must start with v: + +``` +when: + - event: tag + ref: refs/tags/v* +``` + +#### `status` +There are use cases for executing steps on failure, such as sending notifications for failed workflow / pipeline. Use the status constraint to execute steps even when the workflow fails: + +```yml + steps: + - name: slack + image: plugins/slack + settings: + channel: dev ++ when: ++ - status: [ success, failure ] +``` + +#### `platform` +This condition should be used in conjunction with a matrix workflow as a regular workflow will only be executed by a single agent which only has one arch. + +Execute a step for a specific platform: + +```yml +when: + - platform: linux/amd64 +``` + +Execute a step for a specific platform using wildcards: + +```yml +when: + - platform: [linux/*, windows/amd64] +``` + +#### `matrix` +Execute a step for a single matrix permutation: + +```yml +when: + - matrix: + GO_VERSION: 1.5 + REDIS_VERSION: 2.8 +``` + +#### `instance` +Execute a step only on a certain Woodpecker instance matching the specified hostname: + +```yml +when: + - instance: stage.woodpecker.company.com +``` + +#### `path` +Path conditions are applied only to push and pull_request events. It is currently only available for GitHub, GitLab and Gitea (version 1.18.0 and newer) + +Execute a step only on a pipeline with certain files being changed: + +```yml +when: + - path: 'src/*' +``` + +You can use glob patterns to match the changed files and specify if the step should run if a file matching that pattern has been changed include or if some files have not been changed exclude. + +For pipelines without file changes (empty commits or on events without file changes like tag), you can use on_empty to set whether this condition should be true (default) or false in these cases. + +```yml +when: + - path: + include: ['.woodpecker/*.yaml', '*.ini'] + exclude: ['*.md', 'docs/**'] + ignore_message: '[ALL]' + on_empty: true +``` + +#### `evaluate` +Execute a step only if the provided evaluate expression is equal to true. Both built-in `CI_` and custom variables can be used inside the expression. + +The expression syntax can be found in the docs of the underlying library. + +Run on pushes to the default branch for the repository owner/repo: + +```yml +when: + - evaluate: 'CI_PIPELINE_EVENT == "push" && CI_REPO == "owner/repo" && CI_COMMIT_BRANCH == CI_REPO_DEFAULT_BRANCH' +``` + +Run on commits created by user woodpecker-ci: + +```yml +when: + - evaluate: 'CI_COMMIT_AUTHOR == "woodpecker-ci"' +``` + +Skip all commits containing please ignore me in the commit message: + +```yml +when: + - evaluate: 'not (CI_COMMIT_MESSAGE contains "please ignore me")' +``` + +Run on pull requests with the label deploy: + +```yml +when: + - evaluate: 'CI_COMMIT_PULL_REQUEST_LABELS contains "deploy"' +``` + +### `depends_on` +Normally steps of a workflow are executed serially in the order in which they are defined. As soon as you set `depends_on` for a step a directed acyclic graph will be used and all steps of the workflow will be executed in parallel besides the steps that have a dependency set to another step using `depends_on`: + +```yml + steps: + - name: build # build will be executed immediately + image: golang + commands: + - go build + + - name: deploy + image: plugins/docker + settings: + repo: foo/bar ++ depends_on: [build, test] # deploy will be executed after build and test finished + + - name: test # test will be executed immediately as no dependencies are set + image: golang + commands: + - go test +``` + +> **Note:** +> You can define a step to start immediately without dependencies by adding an empty `depends_on: []`. By setting `depends_on` on a single step all other steps will be immediately executed as well if no further dependencies are specified. + +```yml +steps: + - name: check code format + image: mstruebing/editorconfig-checker + depends_on: [] # enable parallel steps + ... +``` + +### `volumes` +Woodpecker gives the ability to define Docker volumes in the YAML. You can use this parameter to mount files or folders on the host machine into your containers. + +For more details check the volumes docs. + +### `detach` +Woodpecker gives the ability to detach steps to run them in background until the workflow finishes. + +For more details check the service docs. + +### `directory` +Using directory, you can set a subdirectory of your repository or an absolute path inside the Docker container in which your commands will run. + +### `services` +Woodpecker can provide service containers. They can for example be used to run databases or cache containers during the execution of workflow. + +For more details check the services docs. + +### `workspace` +The workspace defines the shared volume and working directory shared by all workflow steps. The default workspace base is `/woodpecker` and the path is extended with the repository URL. So an example would be `/woodpecker/src/github.com/octocat/hello-world`. + +The workspace can be customized using the workspace block in the YAML file: + +```yml ++workspace: ++ base: /go ++ path: src/github.com/octocat/hello-world + + steps: + - name: build + image: golang:latest + commands: + - go get + - go test +``` + +> **Note:** +> Plugins will always have the workspace base at /woodpecker + +The base attribute defines a shared base volume available to all steps. This ensures your source code, dependencies and compiled binaries are persisted and shared between steps. + +```yml + workspace: ++ base: /go + path: src/github.com/octocat/hello-world + + steps: + - name: deps + image: golang:latest + commands: + - go get + - go test + - name: build + image: node:latest + commands: + - go build +``` + +The path attribute defines the working directory of your build. This is where your code is cloned and will be the default working directory of every step in your build process. The path must be relative and is combined with your base path. + +```yml + workspace: + base: /go ++ path: src/github.com/octocat/hello-world +``` + +### `matrix` +Woodpecker has integrated support for matrix builds. Woodpecker executes a separate build task for each combination in the matrix, allowing you to build and test a single commit against multiple configurations. + +For more details check the matrix build docs. + +### `labels +You can set labels for your workflow to select an agent to execute the workflow on. An agent will pick up and run a workflow when every label assigned to it matches the agents labels. + +To set additional agent labels, check the agent configuration options. Agents will have at least four default labels: `platform=agent-os/agent-arch`, `hostname=my-agent`, `backend=docker` (type of the agent backend) and `repo=*`. Agents can use a `*` as a wildcard for a label. For example `repo=*` will match every repo. + +Workflow labels with an empty value will be ignored. By default, each workflow has at least the `repo=your-user/your-repo-name` label. If you have set the platform attribute for your workflow it will have a label like `platform=your-os/your-arch` as well. + +You can add additional labels as a key value map: + +```yml ++labels: ++ location: europe # only agents with `location=europe` or `location=*` will be used ++ weather: sun ++ hostname: "" # this label will be ignored as it is empty + + steps: + - name: build + image: golang + commands: + - go build + - go test +``` + +**Filter by platform:** + +To configure your workflow to only be executed on an agent with a specific platform, you can use the platform key. Have a look at the official go docs for the available platforms. The syntax of the platform is `GOOS/GOARCH` like `linux/arm64` or `linux/amd64`. + +Example: + +Assuming we have two agents, one `linux/arm` and one `linux/amd64`. Previously this workflow would have executed on either agent, as Woodpecker is not fussy about where it runs the workflows. By setting the following option it will only be executed on an agent with the platform `linux/arm64`. + +```yml ++labels: ++ platform: linux/arm64 + + steps: + [...] +``` + +### `clone` +Woodpecker automatically configures a default clone step if not explicitly defined. When using the local backend, the plugin-git binary must be on your `$PATH` for the default clone step to work. If not, you can still write a manual clone step. + +You can manually configure the clone step in your workflow for customization: + +```yml ++clone: ++ git: ++ image: woodpeckerci/plugin-git + + steps: + - name: build + image: golang + commands: + - go build + - go test +``` + +Example configuration to override depth: + +```yml + clone: + - name: git + image: woodpeckerci/plugin-git ++ settings: ++ partial: false ++ depth: 50 +``` + +Example configuration to use a custom clone plugin: + +```yml + clone: + - name: git ++ image: octocat/custom-git-plugin +``` + +Example configuration to clone Mercurial repository: + +```yml + clone: + - name: hg ++ image: plugins/hg ++ settings: ++ path: bitbucket.org/foo/bar +``` + +### `skip_clone` +By default Woodpecker is automatically adding a clone step. This clone step can be configured by the clone property. If you do not need a clone step at all you can skip it using: + +```yml +skip_clone: true +``` + +### `when` - Global workflow conditions +Woodpecker gives the ability to skip whole workflows (not just steps) based on certain conditions by a `when` block. If all conditions in the when block evaluate to true the workflow is executed, otherwise it is skipped, but treated as successful and other workflows depending on it will still continue. + +For more information about the specific filters, take a look at the step-specific when filters. + +Example conditional execution by branch: + +```yml ++when: ++ branch: main ++ + steps: + - name: slack + image: plugins/slack + settings: + channel: dev +``` + +The workflow now triggers on main, but also if the target branch of a pull request is main. + +### `depends_on` +Woodpecker supports to define multiple workflows for a repository. Those workflows will run independent from each other. To depend them on each other you can use the `depends_on` keyword. + +### `runs_on` +Workflows that should run even on failure should set the `runs_on` tag. + +```yml + steps: + - name: notify + image: debian:stable-slim + commands: + - echo notifying + + depends_on: + - deploy + ++runs_on: [ success, failure ] +``` + +### Privileged mode +Woodpecker gives the ability to configure privileged mode in the YAML. You can use this parameter to launch containers with escalated capabilities. + +> **Info:** +> Privileged mode is only available to trusted repositories and for security reasons should only be used in private environments. See project settings to enable trusted mode. + +```yml + steps: + - name: build + image: docker + environment: + - DOCKER_HOST=tcp://docker:2375 + commands: + - docker --tls=false ps + + - name: services + docker: + image: docker:dind + commands: dockerd-entrypoint.sh --storage-driver=vfs --tls=false ++ privileged: true +``` + +## Matrix Workflows +Woodpecker has integrated support for matrix workflows. Woodpecker executes a separate workflow for each combination in the matrix, allowing you to build and test against multiple configurations. + +Example matrix definition: +```yml +matrix: + GO_VERSION: + - 1.4 + - 1.3 + REDIS_VERSION: + - 2.6 + - 2.8 + - 3.0 +``` + +Example matrix definition containing only specific combinations: +```yml +matrix: + include: + - GO_VERSION: 1.4 + REDIS_VERSION: 2.8 + - GO_VERSION: 1.5 + REDIS_VERSION: 2.8 + - GO_VERSION: 1.6 + REDIS_VERSION: 3.0 +``` + +Matrix variables are interpolated in the YAML using the `${VARIABLE}` syntax, before the YAML is parsed. This is an example YAML file before interpolating matrix parameters: + +```yml +matrix: + GO_VERSION: + - 1.4 + - 1.3 + DATABASE: + - mysql:8 + - mysql:5 + - mariadb:10.1 + +steps: + - name: build + image: golang:${GO_VERSION} + commands: + - go get + - go build + - go test + +services: + - name: database + image: ${DATABASE} +``` + +## Secrets +Woodpecker provides the ability to store named parameters external to the YAML configuration file, in a central secret store. These secrets can be passed to individual steps of the pipeline at runtime. + +Woodpecker provides three different levels to add secrets to your pipeline. The following list shows the priority of the different levels. If a secret is defined in multiple levels, will be used following this priorities: Repository secrets > Organization secrets > Global secrets. + +- Repository secrets: They are available to all pipelines of an repository. +- Organization secrets: They are available to all pipelines of an organization. +- Global secrets: Can be configured by an instance admin. They are available to all pipelines of the whole Woodpecker instance and should therefore only be used for secrets that are allowed to be read by all users. + +Secrets are exposed to your pipeline steps and plugins as uppercase environment variables and can therefore be referenced in the commands section of your pipeline, once their usage is declared in the secrets section: + +```yml + steps: + - name: docker + image: docker + commands: ++ - echo $docker_username ++ - echo $DOCKER_PASSWORD ++ secrets: [ docker_username, DOCKER_PASSWORD ] +``` + +The case of the environment variables is not changed, but secret matching is done case-insensitively. In the example above, `DOCKER_PASSWORD` would also match if the secret is called `docker_password`. + +You can set an setting or environment value from secrets using the `from_secret` syntax. + +In this example, the secret named `secret_token` would be passed to the setting named `token`, which will be available in the plugin as environment variable named `PLUGIN_TOKEN` (See plugins for details), and to the environment variable `TOKEN_ENV`. + +```yml + steps: + - name: docker + image: my-plugin ++ environment: ++ TOKEN_ENV: ++ from_secret: secret_token ++ settings: ++ token: ++ from_secret: secret_token +``` + +Please note parameter expressions are subject to pre-processing. When using secrets in parameter expressions they should be escaped. + +```yml + steps: + - name: docker + image: docker + commands: +- - echo ${docker_username} +- - echo ${DOCKER_PASSWORD} ++ - echo $${docker_username} ++ - echo $${DOCKER_PASSWORD} + secrets: [ docker_username, DOCKER_PASSWORD ] +``` + +Secrets are not exposed to pull requests by default. You can override this behavior by creating the secret and enabling the `pull_request` event type, either in UI or by CLI. + +## Registries +Woodpecker provides the ability to add container registries in the settings of your repository. Adding a registry allows you to authenticate and pull private images from a container registry when using these images as a step inside your pipeline. Using registry credentials can also help you avoid rate limiting when pulling images from public registries. + +You must provide registry credentials in the UI in order to pull private container images defined in your YAML configuration file. + +These credentials are never exposed to your steps, which means they cannot be used to push, and are safe to use with pull requests, for example. Pushing to a registry still requires setting credentials for the appropriate plugin. + +## Cron +To create a new cron job adjust your pipeline config(s) and add the event filter to all steps you would like to run by the cron job: + +```yml + steps: + - name: sync_locales + image: weblate_sync + settings: + url: example.com + token: + from_secret: weblate_token ++ when: ++ event: cron ++ cron: "name of the cron job" # if you only want to execute this step by a specific cron job +``` + +Then create a new cron job in the repository settings. + +The supported schedule syntax can be found [here](https://pkg.go.dev/github.com/robfig/cron?utm_source=godoc#hdr-CRON_Expression_Format). + +Examples: `@every 5m`, `@daily`, `0 30 * * * *` ... + +> **Info** +> Woodpeckers cron syntax starts with seconds instead of minutes as used by most linux cron schedulers. +> Example: "At minute 30 every hour" would be `0 30 * * * *` instead of `30 * * * *` + +## Environment Variables +Woodpecker provides the ability to pass environment variables to individual pipeline steps. Note that these can't overwrite any existing, built-in variables. Example pipeline step with custom environment variables: + +```yml + steps: + - name: build + image: golang ++ environment: ++ CGO: 0 ++ GOOS: linux ++ GOARCH: amd64 + commands: + - go build + - go test +``` + +Please note that the environment section is not able to expand environment variables. If you need to expand variables they should be exported in the commands section. + +```yml + steps: + - name: build + image: golang +- environment: +- - PATH=$PATH:/go + commands: ++ - export PATH=$PATH:/go + - go build + - go test +``` + +`${variable}` expressions are subject to pre-processing. If you do not want the pre-processor to evaluate your expression it must be escaped: + +```yml + steps: + - name: build + image: golang + commands: +- - export PATH=${PATH}:/go ++ - export PATH=$${PATH}:/go + - go build + - go test +``` + +### Built-in environment variables +This is the reference list of all environment variables available to your pipeline containers. These are injected into your pipeline step and plugins containers, at runtime. + +| NAME | Description | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| `CI` | CI environment name (value: `woodpecker`) | +| | **Repository** | +| `CI_REPO` | repository full name `/` | +| `CI_REPO_OWNER` | repository owner | +| `CI_REPO_NAME` | repository name | +| `CI_REPO_REMOTE_ID` | repository remote ID, is the UID it has in the forge | +| `CI_REPO_SCM` | repository SCM (git) | +| `CI_REPO_URL` | repository web URL | +| `CI_REPO_CLONE_URL` | repository clone URL | +| `CI_REPO_CLONE_SSH_URL` | repository SSH clone URL | +| `CI_REPO_DEFAULT_BRANCH` | repository default branch (main) | +| `CI_REPO_PRIVATE` | repository is private | +| `CI_REPO_TRUSTED` | repository is trusted | +| | **Current Commit** | +| `CI_COMMIT_SHA` | commit SHA | +| `CI_COMMIT_REF` | commit ref | +| `CI_COMMIT_REFSPEC` | commit ref spec | +| `CI_COMMIT_BRANCH` | commit branch (equals target branch for pull requests) | +| `CI_COMMIT_SOURCE_BRANCH` | commit source branch (empty if event is not `pull_request` or `pull_request_closed`) | +| `CI_COMMIT_TARGET_BRANCH` | commit target branch (empty if event is not `pull_request` or `pull_request_closed`) | +| `CI_COMMIT_TAG` | commit tag name (empty if event is not `tag`) | +| `CI_COMMIT_PULL_REQUEST` | commit pull request number (empty if event is not `pull_request` or `pull_request_closed`) | +| `CI_COMMIT_PULL_REQUEST_LABELS` | labels assigned to pull request (empty if event is not `pull_request` or `pull_request_closed`) | +| `CI_COMMIT_MESSAGE` | commit message | +| `CI_COMMIT_AUTHOR` | commit author username | +| `CI_COMMIT_AUTHOR_EMAIL` | commit author email address | +| `CI_COMMIT_AUTHOR_AVATAR` | commit author avatar | +| `CI_COMMIT_PRERELEASE` | release is a pre-release (empty if event is not `release`) | +| | **Current pipeline** | +| `CI_PIPELINE_NUMBER` | pipeline number | +| `CI_PIPELINE_PARENT` | number of parent pipeline | +| `CI_PIPELINE_EVENT` | pipeline event (see [pipeline events](https://woodpecker-ci.org/docs/usage/terminology#pipeline-events)) | +| `CI_PIPELINE_URL` | link to the web UI for the pipeline | +| `CI_PIPELINE_FORGE_URL` | link to the forge's web UI for the commit(s) or tag that triggered the pipeline | +| `CI_PIPELINE_DEPLOY_TARGET` | pipeline deploy target for `deployment` events (i.e. production) | +| `CI_PIPELINE_DEPLOY_TASK` | pipeline deploy task for `deployment` events (i.e. migration) | +| `CI_PIPELINE_STATUS` | pipeline status (success, failure) | +| `CI_PIPELINE_CREATED` | pipeline created UNIX timestamp | +| `CI_PIPELINE_STARTED` | pipeline started UNIX timestamp | +| `CI_PIPELINE_FINISHED` | pipeline finished UNIX timestamp | +| `CI_PIPELINE_FILES` | changed files (empty if event is not `push` or `pull_request`), it is undefined if more than 500 files are touched | +| | **Current workflow** | +| `CI_WORKFLOW_NAME` | workflow name | +| | **Current step** | +| `CI_STEP_NAME` | step name | +| `CI_STEP_NUMBER` | step number | +| `CI_STEP_STATUS` | step status (success, failure) | +| `CI_STEP_STARTED` | step started UNIX timestamp | +| `CI_STEP_FINISHED` | step finished UNIX timestamp | +| `CI_STEP_URL` | URL to step in UI | +| | **Previous commit** | +| `CI_PREV_COMMIT_SHA` | previous commit SHA | +| `CI_PREV_COMMIT_REF` | previous commit ref | +| `CI_PREV_COMMIT_REFSPEC` | previous commit ref spec | +| `CI_PREV_COMMIT_BRANCH` | previous commit branch | +| `CI_PREV_COMMIT_SOURCE_BRANCH` | previous commit source branch | +| `CI_PREV_COMMIT_TARGET_BRANCH` | previous commit target branch | +| `CI_PREV_COMMIT_URL` | previous commit link in forge | +| `CI_PREV_COMMIT_MESSAGE` | previous commit message | +| `CI_PREV_COMMIT_AUTHOR` | previous commit author username | +| `CI_PREV_COMMIT_AUTHOR_EMAIL` | previous commit author email address | +| `CI_PREV_COMMIT_AUTHOR_AVATAR` | previous commit author avatar | +| | **Previous pipeline** | +| `CI_PREV_PIPELINE_NUMBER` | previous pipeline number | +| `CI_PREV_PIPELINE_PARENT` | previous pipeline number of parent pipeline | +| `CI_PREV_PIPELINE_EVENT` | previous pipeline event (see [pipeline events](https://woodpecker-ci.org/docs/usage/terminology#pipeline-events)) | +| `CI_PREV_PIPELINE_URL` | previous pipeline link in CI | +| `CI_PREV_PIPELINE_FORGE_URL` | previous pipeline link to event in forge | +| `CI_PREV_PIPELINE_DEPLOY_TARGET` | previous pipeline deploy target for `deployment` events (ie production) | +| `CI_PREV_PIPELINE_DEPLOY_TASK` | previous pipeline deploy task for `deployment` events (ie migration) | +| `CI_PREV_PIPELINE_STATUS` | previous pipeline status (success, failure) | +| `CI_PREV_PIPELINE_CREATED` | previous pipeline created UNIX timestamp | +| `CI_PREV_PIPELINE_STARTED` | previous pipeline started UNIX timestamp | +| `CI_PREV_PIPELINE_FINISHED` | previous pipeline finished UNIX timestamp | +| | | +| `CI_WORKSPACE` | Path of the workspace where source code gets cloned to | +| | **System** | +| `CI_SYSTEM_NAME` | name of the CI system: `woodpecker` | +| `CI_SYSTEM_URL` | link to CI system | +| `CI_SYSTEM_HOST` | hostname of CI server | +| `CI_SYSTEM_VERSION` | version of the server | +| | **Forge** | +| `CI_FORGE_TYPE` | name of forge (gitea, github, ...) | +| `CI_FORGE_URL` | root URL of configured forge | +| | **Internal** - Please don't use! | +| `CI_SCRIPT` | Internal script path. Used to call pipeline step commands. | +| `CI_NETRC_USERNAME` | Credentials for private repos to be able to clone data. (Only available for specific images) | +| `CI_NETRC_PASSWORD` | Credentials for private repos to be able to clone data. (Only available for specific images) | +| `CI_NETRC_MACHINE` | Credentials for private repos to be able to clone data. (Only available for specific images) | + +### Global environment variables +If you want specific environment variables to be available in all of your pipelines use the `WOODPECKER_ENVIRONMENT` setting on the Woodpecker server. Note that these can't overwrite any existing, built-in variables. + +``` +WOODPECKER_ENVIRONMENT=first_var:value1,second_var:value2 +``` + +These can be used, for example, to manage the image tag used by multiple projects. + +``` +WOODPECKER_ENVIRONMENT=GOLANG_VERSION:1.18 +``` + +### String Substitution +Woodpecker provides the ability to substitute environment variables at runtime. This gives us the ability to use dynamic settings, commands and filters in our pipeline configuration. + +Example commit substitution: + +```yml + steps: + - name: docker + image: plugins/docker + settings: ++ tags: ${CI_COMMIT_SHA} +``` + +## String Operations +Woodpecker also emulates bash string operations. This gives us the ability to manipulate the strings prior to substitution. Example use cases might include substring and stripping prefix or suffix values. + +| OPERATION | DESCRIPTION | +| ------------------ | ------------------------------------------------ | +| `${param}` | parameter substitution | +| `${param,}` | parameter substitution with lowercase first char | +| `${param,,}` | parameter substitution with lowercase | +| `${param^}` | parameter substitution with uppercase first char | +| `${param^^}` | parameter substitution with uppercase | +| `${param:pos}` | parameter substitution with substring | +| `${param:pos:len}` | parameter substitution with substring and length | +| `${param=default}` | parameter substitution with default | +| `${param##prefix}` | parameter substitution with prefix removal | +| `${param%%suffix}` | parameter substitution with suffix removal | +| `${param/old/new}` | parameter substitution with find and replace | + +Example variable substitution with substring: + +```yml + steps: + - name: docker + image: plugins/docker + settings: ++ tags: ${CI_COMMIT_SHA:0:8} +``` + +Example variable substitution strips v prefix from v.1.0.0: + +```yml + steps: + - name: docker + image: plugins/docker + settings: ++ tags: ${CI_COMMIT_TAG##v} +``` + +## Plugins +Plugins are pipeline steps that perform pre-defined tasks and are configured as steps in your pipeline. Plugins can be used to deploy code, publish artifacts, send notification, and more. + +#wip -> https://woodpecker-ci.org/plugins + +### plugin-git +This plugin is automatically introduced into your pipeline as the first step. Its purpose is to clone your Git repository. + +#### Overriding Settings + +```yaml +clone: + git: + image: woodpeckerci/plugin-git + settings: + depth: 50 + lfs: false +``` + +#### Settings + + + +| Settings Name | Default | Description | +| ------------------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `depth` | _none_ | If specified, uses git's `--depth` option to create a shallow clone with a limited number of commits, overwritten by `partial`. Setting it to `0` disables shallow cloning | +| `lfs` | `true` | Set this to `false` to disable retrieval of LFS files | +| `recursive` | `false` | Clones submodules recursively | +| `skip-verify` | `false` | Skips the SSL verification | +| `tags` | `false` (except on tag event) | Fetches tags when set to true, default is false if event is not tag else true | +| `submodule-overrides` | _none_ | Override submodule urls | +| `submodule-update-remote` | `false` | Pass the --remote flag to git submodule update | +| `submodule-partial` | `true` | Update submodules via partial clone (depth=1) | +| `custom-ssl-path` | _none_ | Set path to custom cert | +| `custom-ssl-url` | _none_ | Set url to custom cert | +| `backoff` | `5sec` | Change backoff duration | +| `attempts` | `5` | Change backoff attempts | +| `branch` | `$CI_COMMIT_BRANCH` | Change branch name to checkout to | +| `partial` | `true` (except if tags are fetched) | Only fetch the one commit and it's blob objects to resolve all files, overwrite depth with 1 | +| `home` | | Change HOME var for commands executed, fail if it does not exist | +| `remote` | `$CI_REPO_CLONE_URL` | Set the git remote url | +| `remote-ssh` | `$CI_REPO_CLONE_SSH_URL` | Set the git SSH remote url | +| `object-format` | detected from commit SHA | Set the object format for Git initialization. Supported values: `sha1`, `sha256`. | +| `sha` | `$CI_COMMIT_SHA` | git commit hash to retrieve | +| `ref` | _none_ | Set the git reference to retrieve | +| `path` | `$CI_WORKSPACE` | Set destination path to clone to | +| `use-ssh` | `false` | Clone using SSH | +| `ssh-key` | _none_ | SSH key for SSH clone | + +### Ansible +Woodpecker CI plugin to execute Ansible playbooks. This plugin is a fork of [drone-plugins/drone-ansible](https://github.com/drone-plugins/drone-ansible) with substantial modifications of the source code. + +#### Installing required python module dependencies +Many ansible modules require additional python dependencies to work. Because ansible is run inside an alpine-based container, these dependencies must be installed dynamically during playbook execution. + +It is important to use `delegate_to: localhost` as otherwise the pip module will install the dependency on the remote host, which will not have an effect. + +```yaml +- name: Install required pip dependencies + delegate_to: localhost + ansible.builtin.pip: + name: + state: present + extra_args: --break-system-packages +``` + +Without `--break-system-packages` alpine will complain aiming for plain pip3 packages being installed system-wide. Alternatively, one can also use the apk/packages module if the required pip module is available as an `python3-` package + +#### Effient handling of Ansible dependencies +By default, each step using the plugin will install the required dependencies using `ansible-galaxy install -r requirements.yml`. Often, one wants to run multiple playbooks in different steps, ideally in parallel. In this case, a step which installs the requirements for all subsequent steps is useful. + +```yaml +steps: + "Install galaxy requirements": + image: pad92/ansible-alpine + commands: + - ansible-galaxy install -r requirements.yml +``` + +In addition, Ansible dependencies can be cached. This avoids having to re-download them for each build, saving bandwith and time. If root access to the Woodpecker instance is given, one can mount a volume to the container and store the dependencies there. + +```yaml +steps: + "Install galaxy requirements": + image: pad92/ansible-alpine + volumes: + - /root/woodpecker-cache/collections:/tmp/collections + commands: + - cp -r /tmp/collections $${CI_WORKSPACE}/ + - ansible-galaxy install -r requirements.yml + - cp -r $${CI_WORKSPACE}/collections /tmp/ +``` + +In the above example, the first command copies the cached dependencies to the workspace directory. After the installation, the dependencies are copied back to the cache directory. Note that this requires the creation of the cache directory on the host upfront (i.e. `/root/woodpecker-cache`). The location of the cache directory can be adjusted to the user's needs. + +Mounting the cache directory directly to `$${CI_WORKSPACE}/collections` is not feasible due to the following reasons: + +- The volume mount conflicts with the volume mount providing the workspace directory to each container +- The mount would need to be added to each step as otherwise the dependencies are missing in these + +#### Settings + +| Settings Name | Default | Description | +| ----------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `become-method` | _none_ | privilege escalation method to use | +| `become-user` | _none_ | run operations as this user | +| `become` | `false` | run operations with become | +| `check` | `false` | run in "check mode"/dry-run, do not apply changes | +| `connection` | _none_ | connection type to use | +| `diff` | `false` | show the differences (may print secrets!) | +| `extra-vars` | _none_ | set additional variables via [key=value list or map](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_variables.html#key-value-format) or load them from [yaml/json files](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_variables.html#vars-from-a-json-or-yaml-file) via `@` prefix | +| `flush-cache` | `false` | clear the fact cache for every host in inventory | +| `force-handlers` | _none_ | run handlers even if a task fails | +| `forks` | `5` | number of parallel processes to use | +| `galaxy-force` | `true` | force overwriting an existing role or collection | +| `galaxy` | _none_ | path to galaxy requirements file | +| `inventory` | _none_ | specify inventory host path | +| `limit` | _none_ | limit selected hosts to an additional pattern | +| `list-hosts` | `false` | outputs a list of matching hosts | +| `list-tags` | `false` | list all available tags | +| `list-tasks` | `false` | list all tasks that would be executed | +| `module-path` | _none_ | prepend paths to module library | +| `playbook` | _none_ | list of playbooks to apply | +| `private-key` | _none_ | SSH private key to connect to host | +| `requirements` | _none_ | path to python requirements file | +| `scp-extra-args` | _none_ | specify extra arguments to pass to scp only | +| `sftp-extra-args` | _none_ | specify extra arguments to pass to sftp only | +| `skip-tags` | _none_ | skip tasks and playbooks with a matching tag | +| `ssh-common-args` | _none_ | specify common arguments to pass to sftp/scp/ssh | +| `ssh-extra-args` | _none_ | specify extra arguments to pass to ssh only | +| `start-at-task` | _none_ | start the playbook at the task matching this **name** | +| `syntax-check` | `false` | perform a syntax check on the playbook | +| `tags` | _none_ | only run plays and tasks tagged with these values | +| `timeout` | _none_ | override the connection timeout in seconds | +| `user` | _none_ | connect as this user | +| `vault-id` | _none_ | the vault identity to used | +| `vault-password` | _none_ | vault password | +| `verbose` | `0` | level of verbosity, 0 up to 4 | + +#### Examples + +```yaml +steps: + '[CI Agent] ansible (apply)': + image: woodpeckerci/plugin-ansible + settings: + playbook: playbooks/ci/agent.yml + diff: true + inventory: environments/prod/inventory.ini + syntax_check: false + limit: ci_agent_prod + become: true + user: root + private_key: + from_secret: id_ed25519_ci + extra_vars: + woodpecker_agent_secret: + from_secret: woodpecker_agent_secret + woodpecker_agent_secret_baarkerlounger: + from_secret: woodpecker_agent_secret_baarkerlounger +``` + +### plugin-release +Woodpecker CI plugin to create a release and upload assets in the forge. + +If the release already exists matching the tag, it will be used without overwriting. Files will still be uploaded based on the `file-exists` setting. + +Supports Gitea, Forgejo and GitHub. + +#### Settings + +| Settings Name | Default | Description | +| ------------------------ | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `api-key` | _none_ | API access token | +| `files` | _none_ | List of files to upload (accepts [globs](https://pkg.go.dev/path/filepath#Match)) | +| `file-exists` | `overwrite` | What to do if files already exist; one of `overwrite`, `fail`, or `skip` | +| `checksum` | _none_ | Generate checksums for specific files | +| `checksum-file` | `CHECKSUMsum.txt` | name used for checksum file. `CHECKSUM` is replaced with the chosen method (default: `CHECKSUMsum.txt`) | +| `checksum-flatten` | `false` | include only the basename of the file in the checksum file | +| `target` | `CI_REPO_DEFAULT_BRANCH` | Branch where further development happens (usually `main`) | +| `draft` | `false` | Create a draft release | +| `skip-verify` | `false` | Visit `base-url` and skip verifying certificate | +| `prerelease` | `false` | Create a pre-release | +| `base-url` | `CI_FORGE_URL` | Base URL | +| `upload-url` | `https://uploads.github.com/` | upload url for GitHub | +| `note` | _none_ | File or string with notes for the release (ex: changelog) | +| `title` | _none_ | File or string with the title for the release | +| `env-file` | _none_ | Path to a `.env` file to load | +| `overwrite` | `false` | force overwrite existing release information (title, note and publish if release was draft before and `draft=true`, discussion category if none) | +| `discussion-category` | _none_ | create a discussion in the given category (github) | +| `generate-release-notes` | `false` | automatically generate GitHub release notes | +| `env-file` | _none_ | load env vars from file | + +#### Example + +```yaml +publish: + image: woodpeckerci/plugin-release + settings: + files: + # Could also be "hello-world*" to match both + - 'hello-world' + - 'hello-world.exe' + api_key: + from_secret: ACCESS_TOKEN +``` + +### Git Push +Use this plugin for commit and push an git repo. You will need to supply Drone / Woodpecker with a private SSH key or use the same credentials as the cloned repo to being able to push changes. + +```yaml +- name: push commit + image: appleboy/drone-git-push + settings: + branch: master + remote: ssh://git@git.heroku.com/falling-wind-1624.git + force: false + commit: true +``` + +An example of pushing a branch back to the current repository: + +```yaml +- name: push commit + image: appleboy/drone-git-push + settings: + remote_name: origin + branch: gh-pages + local_ref: gh-pages +``` + +An example of specifying the path to a repo: + +```yaml +- name: push commit + image: appleboy/drone-git-push + settings: + remote_name: origin + branch: gh-pages + local_ref: gh-pages + path: path/to/repo +``` + +#### Parameter Reference + +| setting | description | +| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ssh_key | private SSH key for the remote machine (make sure it ends with a newline) | +| remote | target remote repository (if blank, assume exists) | +| remote_name | name of the remote to use locally (default "deploy") | +| branch | target remote branch, defaults to master | +| local_branch | local branch or ref to push (default "HEAD") | +| path | path to git repo (if blank, assume current directory) | +| force | force push using the `--force` flag, defaults to false | +| skip_verify | skip verification of HTTPS certs, defaults to false | +| commit | add and commit the contents of the repo before pushing, defaults to false | +| commit_message | add a custom message for commit, if it is omitted, it will be `[skip ci] Commit dirty state` | +| empty_commit | if you only want generate an empty commit, you can do it using this option | +| tag | if you want to add a tag to the commit, you can do it using this option. You must also set `followtags` to `true` if you want the tag to be pushed to the remote | +| author_name | the name to use for the author of the commit (if blank, assume push commiter name) | +| author_email | the email address to use for the author of the commit (if blank, assume push commiter name) | +| followtags | push with `--follow-tags` option | +| rebase | pull `--rebase` before pushing | + +### S3 Plugin +The S3 plugin uploads files and build artifacts to your S3 bucket, or S3-compatible bucket such as Minio. The below pipeline configuration demonstrates simple usage: + +```yml +steps: + upload: + image: woodpeckerci/plugin-s3 + settings: + bucket: my-bucket-name + access_key: a50d28f4dd477bc184fbd10b376de753 + secret_key: **************************************** + source: public/**/* + target: /target/location +``` + +Source the aws credentials from secrets: + +```yml +steps: + upload: + image: woodpeckerci/plugin-s3 + settings: + bucket: my-bucket-name + access_key: + from_secret: aws_access_key_id + secret_key: + from_secret: aws_secret_access_key + source: public/**/* + target: /target/location +``` + +Use the build number in the S3 target prefix: + +```yml +steps: + upload: + image: woodpeckerci/plugin-s3 + settings: + bucket: my-bucket-name + source: public/**/* + target: /target/location/${CI_BUILD_NUMBER} +``` + +Configure the plugin to strip path prefixes when uploading: + +```yml +steps: + upload: + image: woodpeckerci/plugin-s3 + settings: + bucket: my-bucket-name + source: public/**/* + target: /target/location + strip_prefix: public/ +``` + +Configure the plugin to exclude files from upload and compress: + +```yml +steps: + upload: + image: woodpeckerci/plugin-s3 + settings: + bucket: my-bucket-name + source: public/**/* + target: /target/location + exclude: + - **/*.xml + compress: true +``` + +Configure the plugin to connect to a Minio server: + +```yml +steps: + upload: + image: woodpeckerci/plugin-s3 + settings: + bucket: my-bucket-name + source: public/**/* + target: /target/location + path_style: true + endpoint: https://play.minio.io:9000 +``` + +#### Settings + +| setting | description | +| ------------ | -------------------------------------------------------------------------------------------------------------- | +| endpoint | custom endpoint URL (optional, to use a S3 compatible non-Amazon service) | +| access_key | amazon key (optional) | +| secret_key | amazon secret key (optional) | +| bucket | bucket name | +| region | bucket region (us-east-1, eu-west-1, etc) | +| acl | access to files that are uploaded (private, public-read, etc) | +| source | source location of the files, using a glob matching pattern. Location must be within the woodpecker workspace. | +| target | target location of files in the bucket | +| encryption | if provided, use server-side encryption | +| strip_prefix | strip the prefix from source path | +| exclude | glob exclusion patterns | +| path_style | whether path style URLs should be used (true for minio) | +| env_file | load env vars from file | +| compress | prior to upload, compress files and use gzip content-encoding (false by default) | +| overwrite | overwrite existing files (true by default) | + +### Docker Buildx +Woodpecker CI plugin to build multiarch Docker images with buildx. This plugin is a fork of [thegeeklab/drone-docker-buildx](https://github.com/thegeeklab/drone-docker-buildx/) which itself is a fork of [drone-plugins/drone-docker](https://github.com/drone-plugins/drone-docker). + +#### Settings + +| Settings Name | Default | Description | +| ----------------------- | ----------------------------- | -------------------------------------------------- | +| `dry-run` | `false` | disables docker push | +| `repo` | _none_ | sets repository name for the image (can be a list) | +| `username` | _none_ | sets username to authenticates with | +| `password` | _none_ | sets password / token to authenticates with | +| `aws_access_key_id` | _none_ | sets AWS_ACCESS_KEY_ID for AWS ECR auth | +| `aws_secret_access_key` | _none_ | sets AWS_SECRET_ACCESS_KEY for AWS ECR auth | +| `aws_region` | `us-east-1` | sets AWS_DEFAULT_REGION for AWS ECR auth | +| `password` | _none_ | sets password / token to authenticates with | +| `email` | _none_ | sets email address to authenticates with | +| `registry` | `https://index.docker.io/v1/` | sets docker registry to authenticate with | +| `dockerfile` | `Dockerfile` | sets dockerfile to use for the image build | +| `tag`/`tags` | _none_ | sets repository tags to use for the image | +| `platforms` | _none_ | sets target platform for build | +| `provenance` | _none_ | sets provenance for build | +| `remote-builders` | _none_ | sets remote builders for build | +| `ssh-key` | _none_ | sets an ssh key to connect to remote builders | + +#### Examples + +```yaml +publish-next-agent: + image: woodpeckerci/plugin-docker-buildx + settings: + repo: woodpeckerci/woodpecker-agent + dockerfile: docker/Dockerfile.agent.multiarch + platforms: windows/amd64,darwin/amd64,darwin/arm64,freebsd/amd64,linux/amd64,linux/arm64/v8 + tag: next + username: + from_secret: docker_username + password: + from_secret: docker_password + when: + branch: ${CI_REPO_DEFAULT_BRANCH} + event: push +``` + +```yaml +publish: + image: woodpeckerci/plugin-docker-buildx + settings: + platforms: linux/386,linux/amd64,linux/arm/v6,linux/arm64/v8,linux/ppc64le,linux/riscv64,linux/s390x + repo: codeberg.org/${CI_REPO_OWNER}/hello + registry: codeberg.org + tags: latest + username: ${CI_REPO_OWNER} + password: + from_secret: cb_token +``` + +```yaml +docker-build: + image: woodpeckerci/plugin-docker-buildx + settings: + repo: codeberg.org/${CI_REPO_OWNER}/hello + registry: codeberg.org + dry-run: true + output: type=oci,dest=${CI_REPO_OWNER}-hello.tar +``` + +#### Advanced Settings + +| Settings Name | Default | Description | +| ---------------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `mirror` | _none_ | sets a registry mirror to pull images | +| `storage_driver` | _none_ | sets the docker daemon storage driver | +| `storage_path` | `/var/lib/docker` | sets the docker daemon storage path | +| `bip` | _none_ | allows the docker daemon to bride ip address | +| `mtu` | _none_ | sets docker daemon custom mtu setting | +| `custom_dns` | _none_ | sets custom docker daemon dns server | +| `custom_dns_search` | _none_ | sets custom docker daemon dns search domain | +| `insecure` | `false` | allows the docker daemon to use insecure registries | +| `ipv6` | `false` | enables docker daemon IPv6 support | +| `experimental` | `false` | enables docker daemon experimental mode | +| `debug` | `false` | enables verbose debug mode for the docker daemon | +| `daemon_off` | `false` | disables the startup of the docker daemon | +| `buildkit_debug` | `false` | enables debug output of buildkit | +| `buildkit_config` | _none_ | Can only be changed for insecure image. Sets content of the docker [buildkit TOML config](https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md) | +| `buildkit_driveropt` | _none_ | Can only be changed for insecure image. Adds one or multiple `--driver-opt` buildx arguments for the default buildkit builder instance | +| `tags_file` | _none_ | overrides the `tags` option with values in a file named `.tags`; multiple tags can be specified separated by a newline | +| `context` | `.` | sets the path of the build context to use | +| `auto_tag` | `false` | generates tag names automatically based on git branch and git tag, tags supplied via `tags` are additionally added to the `auto_tags` without suffix | +| `default_suffix`/`auto_tag_suffix` | _none_ | generates tag names with the given suffix | +| `default_tag` | `latest` | overrides the default tag name used when generating with `auto_tag` enabled | +| `label`/`labels` | _none_ | sets labels to use for the image in format `=` | +| `default_labels`/`auto_labels` | `true` | sets docker image labels based on git information | +| `build_args` | _none_ | sets custom build arguments for the build | +| `build_args_from_env` | _none_ | forwards environment variables as custom arguments to the build | +| `secrets` | _none_ | Sets the build secrets for the build | +| `quiet` | `false` | enables suppression of the build output | +| `target` | _none_ | sets the build target to use | +| `cache_from` | _none_ | sets configuration for cache source | +| `cache_to` | _none_ | sets configuration for cache export | +| `cache_images` | _none_ | a list of images to use as cache. | +| `pull_image` | `true` | enforces to pull base image at build time | +| `compress` | `false` | enables compression of the build context using gzip | +| `config` | _none_ | sets content of the docker daemon json config | +| `purge` | `true` | enables cleanup of the docker environment at the end of a build | +| `no_cache` | `false` | disables the usage of cached intermediate containers | +| `add_host` | _none_ | sets additional host:ip mapping | +| `output` | _none_ | sets build output in format`type=[,=]` | +| `logins` | _none_ | option to log into multiple registries | +| `env_file` | _none_ | load env vars from specified file | +| `ecr_create_repository` | `false` | creates the ECR repository if it does not exist | +| `ecr_lifecycle_policy` | _none_ | AWS ECR lifecycle policy | +| `ecr_repository_policy` | _none_ | AWS ECR repository policy | +| `ecr_scan_on_push` | _none_ | AWS: whether to enable image scanning on push | +| `http_proxy` | _none_ | Set an http proxy if needed. It is also forwarded as build arg called "HTTP_PROXY". | +| `https_proxy` | _none_ | Set an https proxy if needed. It is also forwarded as build arg called "HTTPS_PROXY". | +| `no_proxy` | _none_ | Set (sub-)domains to be ignored by proxy settings. It is also forwarded as build arg called "NO_PROXY". | + +#### Multi registry push example + +```yaml +settings: + repo: a6543/tmp,codeberg.org/6543/tmp + tag: demo + logins: + - registry: https://index.docker.io/v1/ + username: a6543 + password: + from_secret: docker_token + mirrors: + - "my-docker-mirror-host.local" + - registry: https://codeberg.org + username: "6543" + password: + from_secret: cb_token + - registry: https://.dkr.ecr..amazonaws.com + aws_region: + aws_access_key_id: + from_secret: aws_access_key_id + aws_secret_access_key: + from_secret: aws_secret_access_key +``` + +## Using remote builders +When building for multiple platforms, you might want to offload some builds to a remote server, to avoid emulation. To support this, provide a list build servers to `remote-builders`. These servers will need key authentication, so you will also need to provide a (private) SSH key. + +```yaml +build: + image: woodpeckerci/plugin-docker-buildx + settings: + platforms: linux/amd64,linux/arm64 + repo: codeberg.org/${CI_REPO_OWNER}/hello + registry: codeberg.org + dry-run: true + ssh-key: + from_secret: ssh_key + remote-builders: root@my-amd64-build-server,root@my-arm64-build-server +``` + +If you want to mix local and remote builders, the list can include "local": + +```yaml +build: + image: woodpeckerci/plugin-docker-buildx + settings: + platforms: linux/amd64,linux/arm64 + repo: codeberg.org/${CI_REPO_OWNER}/hello + registry: codeberg.org + dry-run: true + ssh-key: + from_secret: ssh_key + remote-builders: local,root@my-arm64-build-server +``` + +## Services +Woodpecker provides a services section in the YAML file used for defining service containers. The below configuration composes database and cache containers. + +Services are accessed using custom hostnames. In the example below, the MySQL service is assigned the hostname database and is available at `database:3306`. + +```yml +steps: + - name: build + image: golang + commands: + - go build + - go test + +services: + - name: database + image: mysql + + - name: cache + image: redis +``` + +You can define a port and a protocol explicitly: + +```yml +services: + - name: database + image: mysql + ports: + - 3306 + + - name: wireguard + image: wg + ports: + - 51820/udp +``` + +Service containers generally expose environment variables to customize service startup such as default usernames, passwords and ports. Please see the official image documentation to learn more. + +```yml + services: + - name: database + image: mysql ++ environment: ++ - MYSQL_DATABASE=test ++ - MYSQL_ALLOW_EMPTY_PASSWORD=yes + + - name: cache + image: redis +``` + +Service and long running containers can also be included in the pipeline section of the configuration using the detach parameter without blocking other steps. This should be used when explicit control over startup order is required. + +```yml + steps: + - name: build + image: golang + commands: + - go build + - go test + + - name: database + image: redis ++ detach: true + + - name: test + image: golang + commands: + - go test +``` + +Containers from detached steps will terminate when the pipeline ends. + +Service containers require time to initialize and begin to accept connections. If you are unable to connect to a service you may need to wait a few seconds or implement a backoff. + +```yml + steps: + - name: test + image: golang + commands: ++ - sleep 15 + - go get + - go test + + services: + - name: database + image: mysql +``` + +## Volumes +Woodpecker gives the ability to define Docker volumes in the YAML. You can use this parameter to mount files or folders on the host machine into your containers. +note + +> **Info**: Volumes are only available to trusted repositories and for security reasons should only be used in private environments. See project settings to enable trusted mode. + +```yml + steps: + - name: build + image: docker + commands: + - docker build --rm -t octocat/hello-world . + - docker run --rm octocat/hello-world --test + - docker push octocat/hello-world + - docker rmi octocat/hello-world + volumes: ++ - /var/run/docker.sock:/var/run/docker.sock +``` + +Please note that Woodpecker mounts volumes on the host machine. This means you must use absolute paths when you configure volumes. Attempting to use relative paths will result in an error. + +## Status Badges +Woodpecker has integrated support for repository status badges. These badges can be added to your website or project readme file to display the status of your code. + +``` +:///api/badges//status.svg +``` + +The status badge displays the status for the latest build to your default branch (e.g. main). You can customize the branch by adding the branch query parameter. + +``` +:///api/badges//status.svg?branch= +``` + +Please note status badges do not include pull request results, since the status of a pull request does not provide an accurate representation of your repository state. + +## Prometheus +Woodpecker is compatible with Prometheus and exposes a `/metrics` endpoint if the environment variable `WOODPECKER_PROMETHEUS_AUTH_TOKEN` is set. Please note that access to the metrics endpoint is restricted and requires the authorization token from the environment variable mentioned above. + +```yml +global: + scrape_interval: 60s + +scrape_configs: + - job_name: 'woodpecker' + bearer_token: dummyToken... + + static_configs: + - targets: ['woodpecker.domain.com'] +``` + +An administrator will need to generate a user API token and configure in the Prometheus configuration file as a bearer token. Please see the following example: + +```yml + global: + scrape_interval: 60s + + scrape_configs: + - job_name: 'woodpecker' ++ bearer_token: dummyToken... + + static_configs: + - targets: ['woodpecker.domain.com'] +``` + +## Docker-Compose +```yml +version: '3' + +services: + woodpecker-server: + image: woodpeckerci/woodpecker-server:latest + ports: + - 8000:8000 + volumes: + - woodpecker-server-data:/var/lib/woodpecker/ + environment: + - WOODPECKER_OPEN=true + - WOODPECKER_HOST=${WOODPECKER_HOST} + - WOODPECKER_GITHUB=true + - WOODPECKER_GITHUB_CLIENT=${WOODPECKER_GITHUB_CLIENT} + - WOODPECKER_GITHUB_SECRET=${WOODPECKER_GITHUB_SECRET} + - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET} + + woodpecker-agent: + image: woodpeckerci/woodpecker-agent:latest + command: agent + restart: always + depends_on: + - woodpecker-server + volumes: + - woodpecker-agent-config:/etc/woodpecker + - /var/run/docker.sock:/var/run/docker.sock + environment: + - WOODPECKER_SERVER=woodpecker-server:9000 + - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET} + +volumes: + woodpecker-server-data: + woodpecker-agent-config: +``` From c063dcd650bcbfb2c3b9f463588ffa1ede8d4470 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Tue, 3 Dec 2024 10:38:21 +0100 Subject: [PATCH 03/99] update --- technology/applications/web/WoodpeckerCI.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/technology/applications/web/WoodpeckerCI.md b/technology/applications/web/WoodpeckerCI.md index 9aa6f41..5666fda 100644 --- a/technology/applications/web/WoodpeckerCI.md +++ b/technology/applications/web/WoodpeckerCI.md @@ -9,7 +9,7 @@ rev: 2024-12-03 Woodpecker is a simple, yet powerful CI/CD engine with great extensibility. ## Workflow Syntax -The Workflow section defines a list of steps to build, test and deploy your code. The steps are executed serially in the order in which they are defined. If a step returns a non-zero exit code, the workflow and therefore the entire pipeline terminates immediately and returns an error status. +The Workflow section defines a list of steps to build, test and deploy your code. The steps are executed serially in the order in which they are defined. If a step returns a non-zero exit code, the workflow and therefore the entire pipeline terminates immediately and returns an error status. The workflow files are stored in `.woodpecker` inside your repository. Example steps: From 686440f30781cafe5d9d131214721b40571c049a Mon Sep 17 00:00:00 2001 From: JMARyA Date: Tue, 3 Dec 2024 10:38:47 +0100 Subject: [PATCH 04/99] woodpecker ci --- .gitea/workflows/validate_schema.yml | 20 -------------------- .woodpecker/validate_schema.yml | 9 +++++++++ 2 files changed, 9 insertions(+), 20 deletions(-) delete mode 100644 .gitea/workflows/validate_schema.yml create mode 100644 .woodpecker/validate_schema.yml diff --git a/.gitea/workflows/validate_schema.yml b/.gitea/workflows/validate_schema.yml deleted file mode 100644 index fc1da67..0000000 --- a/.gitea/workflows/validate_schema.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Validate Schema - -on: - push: - branches: - - main - -jobs: - validate: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Validation - uses: docker://git.hydrar.de/mdtools/mdtools:latest - with: - entrypoint: /bin/bash - args: scripts/validate_schema.sh diff --git a/.woodpecker/validate_schema.yml b/.woodpecker/validate_schema.yml new file mode 100644 index 0000000..eaed522 --- /dev/null +++ b/.woodpecker/validate_schema.yml @@ -0,0 +1,9 @@ +when: + - event: push + branch: main + +steps: + - name: "Validate Schema" + image: git.hydrar.de/mdtools/mdtools:latest + commands: + - /bin/bash scripts/validate_schema.sh From ae741d1ced951660c2f071b3f635c762f1502889 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Tue, 3 Dec 2024 21:20:35 +0100 Subject: [PATCH 05/99] update --- technology/applications/web/WoodpeckerCI.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/technology/applications/web/WoodpeckerCI.md b/technology/applications/web/WoodpeckerCI.md index 5666fda..bde90ef 100644 --- a/technology/applications/web/WoodpeckerCI.md +++ b/technology/applications/web/WoodpeckerCI.md @@ -990,8 +990,6 @@ Example variable substitution strips v prefix from v.1.0.0: ## Plugins Plugins are pipeline steps that perform pre-defined tasks and are configured as steps in your pipeline. Plugins can be used to deploy code, publish artifacts, send notification, and more. -#wip -> https://woodpecker-ci.org/plugins - ### plugin-git This plugin is automatically introduced into your pipeline as the first step. Its purpose is to clone your Git repository. From 0b59b7e44ce89a443f0787e468d0cb8ea06b8a35 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Wed, 4 Dec 2024 14:07:33 +0100 Subject: [PATCH 06/99] update git --- technology/dev/Git.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/technology/dev/Git.md b/technology/dev/Git.md index c9b1609..f6cb120 100644 --- a/technology/dev/Git.md +++ b/technology/dev/Git.md @@ -3,7 +3,7 @@ obj: application wiki: https://en.wikipedia.org/wiki/Git repo: https://github.com/git/git website: https://git-scm.com -rev: 2024-04-15 +rev: 2024-12-04 --- # Git @@ -286,4 +286,19 @@ git am --abort < patch ## .gitignore A `.gitignore` file specifies intentionally untracked files that Git should ignore. Files already tracked by Git are not affected. -This file contains pattern on each line which exclude files from git versioning. \ No newline at end of file +This file contains pattern on each line which exclude files from git versioning. + +## Git Hooks +Git hooks are custom scripts that run automatically in response to certain Git events or actions. These hooks are useful for automating tasks like code quality checks, running tests, enforcing commit message conventions, and more. Git hooks can be executed at different points in the Git workflow, such as before or after a commit, push, or merge. + +Git hooks are stored in the `.git/hooks` directory of your repository. By default, this directory contains example scripts with the `.sample` extension. You can customize these scripts by removing the `.sample` extension and editing them as needed. + +Hooks only apply to your local repository. If a hook script fails it prevents the associated action as well. + +### Common Git Hooks +- pre-commit +- prepare-commit-msg +- commit-msg +- post-commit +- post-checkout +- pre-rebase From 67b61cff70c2a749e33323fa8efbf5c0d22813cc Mon Sep 17 00:00:00 2001 From: JMARyA Date: Tue, 10 Dec 2024 10:25:15 +0100 Subject: [PATCH 07/99] add usql --- technology/applications/Applications.md | 3 +- technology/applications/cli/usql.md | 229 ++++++++++++++++++++++++ 2 files changed, 231 insertions(+), 1 deletion(-) create mode 100644 technology/applications/cli/usql.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 0cec095..36d6fe3 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -1,6 +1,6 @@ --- obj: meta/collection -rev: 2024-07-14 +rev: 2024-12-10 --- # Applications @@ -262,6 +262,7 @@ rev: 2024-07-14 - [Docker](../tools/Docker.md) - [Podman](../tools/Podman.md) - [serie](./cli/serie.md) +- [usql](./cli/usql.md) ## Media - [yt-dlp](./media/yt-dlp.md) diff --git a/technology/applications/cli/usql.md b/technology/applications/cli/usql.md new file mode 100644 index 0000000..c648374 --- /dev/null +++ b/technology/applications/cli/usql.md @@ -0,0 +1,229 @@ +--- +obj: application +repo: https://github.com/xo/usql +rev: 2024-12-10 +--- + +# usql +usql is a universal command-line interface for PostgreSQL, MySQL, Oracle Database, SQLite3, Microsoft SQL Server, and many other databases including NoSQL and non-relational databases! + +usql provides a simple way to work with SQL and NoSQL databases via a command-line inspired by PostgreSQL's psql. usql supports most of the core psql features, such as variables, backticks, backslash commands and has additional features that psql does not, such as multiple database support, copying between databases, syntax highlighting, context-based completion, and terminal graphics. + +## Usage + +```sh +usql [options]... [DSN] +``` + +DSN can be any database connection string like `sqlite:///path/to/my/file` or `postgres://user:pass@host:port/db`. + +### Options + +| Option | Description | +| ----------------------------------------- | -------------------------------------------------------------------------------------- | +| `-c, --command COMMAND` | run only single command (SQL or internal) and exit | +| `-f, --file FILE` | execute commands from file and exit | +| `-w, --no-password` | never prompt for password | +| `-X, --no-init` | do not execute initialization scripts (aliases: `--no-rc` `--no-psqlrc` `--no-usqlrc`) | +| `-o, --out FILE` | output file | +| `-W, --password` | force password prompt (should happen automatically) | +| `-1, --single-transaction` | execute as a single transaction (if non-interactive) | +| `-v, --set NAME=VALUE` | set variable NAME to VALUE (see \set command, aliases: --var --variable) | +| `-N, --cset NAME=DSN` | set named connection NAME to DSN (see \cset command) | +| `-P, --pset VAR=ARG` | set printing option VAR to ARG (see \pset command) | +| `-F, --field-separator FIELD-SEPARATOR` | field separator for unaligned and CSV output | +| `-R, --record-separator RECORD-SEPARATOR` | record separator for unaligned and CSV output (default \n) | +| `-T, --table-attr TABLE-ATTR` | set HTML table tag attributes (e.g., width, border) | +| `-A, --no-align` | unaligned table output mode | +| `-H, --html` | HTML table output mode | +| `-t, --tuples-only` | print rows only | +| `-x, --expanded` | turn on expanded table output | +| `-z, --field-separator-zero` | set field separator for unaligned and CSV output to zero byte | +| `-0, --record-separator-zero` | set record separator for unaligned and CSV output to zero byte | +| `-J, --json` | JSON output mode | +| `-C, --csv` | CSV output mode | +| `-G, --vertical` | vertical output mode | +| `-q, --quiet` | run quietly (no messages, only query output) | +| `--config string` | config file | + +## Commands + +| Command | Description | +| ---------------------------------- | ----------------------------------------------------------------------------- | +| **General:** | | +| `\q` | quit usql | +| `\quit` | alias for `\q` | +| `\drivers` | show database drivers available to usql | +| **Connection:** | | +| `\c DSN` | connect to database url | +| `\c DRIVER PARAMS...` | connect to database with driver and parameters | +| `\cset [NAME [DSN]]` | set named connection, or list all if no parameters | +| `\cset NAME DRIVER PARAMS...` | define named connection for database driver | +| `\Z` | close database connection | +| `\password [USERNAME]` | change the password for a user | +| `\conninfo` | display information about the current database connection | +| **Operating System:** | | +| `\cd [DIR]` | change the current working directory | +| `\getenv VARNAME ENVVAR` | fetch environment variable | +| `\setenv NAME [VALUE]` | set or unset environment variable | +| `\! [COMMAND]` | execute command in shell or start interactive shell | +| `\timing [on/off]` | toggle timing of commands | +| **Variables:** | | +| `\prompt [-TYPE] VAR [PROMPT]` | prompt user to set variable | +| `\set [NAME [VALUE]]` | set internal variable, or list all if no parameters | +| `\unset NAME` | unset (delete) internal variable | +| **Query Execute:** | | +| `\g [(OPTIONS)] [FILE] or ;` | execute query (and send results to file or pipe) | +| `\G [(OPTIONS)] [FILE]` | as \g, but forces vertical output mode | +| `\gx [(OPTIONS)] [FILE]` | as \g, but forces expanded output mode | +| `\gexec` | execute query and execute each value of the result | +| `\gset [PREFIX]` | execute query and store results in usql variables | +| **Query Buffer:** | | +| `\e [FILE] [LINE]` | edit the query buffer (or file) with external editor | +| `\p` | show the contents of the query buffer | +| `\raw` | show the raw (non-interpolated) contents of the query buffer | +| `\r` | reset (clear) the query buffer | +| **Input/Output:** | | +| `\copy SRC DST QUERY TABLE` | copy query from source url to table on destination url | +| `\copy SRC DST QUERY TABLE(A,...)` | copy query from source url to columns of table on destination url | +| `\echo [-n] [STRING]` | write string to standard output (-n for no newline) | +| `\qecho [-n] [STRING]` | write string to \o output stream (-n for no newline) | +| `\warn [-n] [STRING]` | write string to standard error (-n for no newline) | +| `\o [FILE]` | send all query results to file or pipe | +| **Informational:** | | +| `\d[S+] [NAME]` | list tables, views, and sequences or describe table, view, sequence, or index | +| `\da[S+] [PATTERN]` | list aggregates | +| `\df[S+] [PATTERN]` | list functions | +| `\di[S+] [PATTERN]` | list indexes | +| `\dm[S+] [PATTERN]` | list materialized views | +| `\dn[S+] [PATTERN]` | list schemas | +| `\dp[S] [PATTERN]` | list table, view, and sequence access privileges | +| `\ds[S+] [PATTERN]` | list sequences | +| `\dt[S+] [PATTERN]` | list tables | +| `\dv[S+] [PATTERN]` | list views | +| `\l[+]` | list databases | +| `\ss[+] [TABLE/QUERY] [k]` | show stats for a table or a query | +| **Formatting:** | | +| `\pset [NAME [VALUE]]` | Set table output option | +| `\a` | Toggle between unaligned and aligned output mode | +| `\C [STRING]` | Set table title, or unset if none | +| `\f [STRING]` | Show or set field separator for unaligned query output | +| `\H` | Toggle HTML output mode | +| `\T [STRING]` | Set HTML tag attributes, or unset if none | +| `\t [on/off]` | Show only rows | +| `\x [on/off/auto]` | Toggle expanded output | +| **Transaction:** | | +| `\\begin` | Begin a transaction | +| `\\begin [-read-only] [ISOLATION]` | Begin a transaction with isolation level | +| `\\commit` | Commit current transaction | +| `\\rollback` | Rollback (abort) current transaction | + +## Configuration +During its initialization phase, usql reads a standard YAML configuration file `config.yaml`. On Windows this is `%AppData%/usql/config.yaml`, on macOS this is `$HOME/Library/Application Support/usql/config.yaml`, and on Linux and other Unix systems this is normally `$HOME/.config/usql/config.yaml`. + +```yml +# named connections +# name can be used instead of database url +connections: + my_couchbase_conn: couchbase://Administrator:P4ssw0rd@localhost + my_clickhouse_conn: clickhouse://clickhouse:P4ssw0rd@localhost + css: cassandra://cassandra:cassandra@localhost + fsl: flightsql://flight_username:P4ssw0rd@localhost + gdr: + protocol: godror + username: system + password: P4ssw0rd + hostname: localhost + port: 1521 + database: free + ign: ignite://ignite:ignite@localhost + mss: sqlserver://sa:Adm1nP@ssw0rd@localhost + mym: mysql://root:P4ssw0rd@localhost + myz: mymysql://root:P4ssw0rd@localhost + ora: oracle://system:P4ssw0rd@localhost/free + ore: oracle://system:P4ssw0rd@localhost:1522/db1 + pgs: postgres://postgres:P4ssw0rd@localhost + pgx: pgx://postgres:P4ssw0rd@localhost + vrt: + proto: vertica + user: vertica + pass: vertica + host: localhost + sll: + file: /path/to/mydb.sqlite3 + mdc: modernsqlite:test.db + dkd: test.duckdb + zzz: ["databricks", "token:dapi*****@adb-*************.azuredatabricks.net:443/sql/protocolv1/o/*********/*******"] + zz2: + proto: mysql + user: "my username" + pass: "my password!" + host: localhost + opts: + opt1: "😀" + +# init script +init: | + \echo welcome to the jungle `date` + \set SYNTAX_HL_STYLE paraiso-dark + \set PROMPT1 '\033[32m%S%M%/%R%#\033[0m ' + \set bar test + \set foo test + -- \set SHOW_HOST_INFORMATION false + -- \set SYNTAX_HL false + \set 型示師 '本門台初埼本門台初埼' + +# charts path +charts_path: charts +# defined queries +queries: + q1: +``` + +### Time Formatting +Some databases support time/date columns that support formatting. By default, usql formats time/date columns as RFC3339Nano, and can be set using `\pset time FORMAT`: + +``` +$ usql pg:// +Connected with driver postgres (PostgreSQL 13.2 (Debian 13.2-1.pgdg100+1)) +Type "help" for help. + +pg:postgres@=> \pset +time RFC3339Nano +pg:postgres@=> select now(); + now +----------------------------- + 2021-05-01T22:21:44.710385Z +(1 row) + +pg:postgres@=> \pset time Kitchen +Time display is "Kitchen" ("3:04PM"). +pg:postgres@=> select now(); + now +--------- + 10:22PM +(1 row) +``` + +usql's time format supports any Go supported time format, or can be any standard Go const name, such as Kitchen above. See below for an overview of the available time constants. + +#### Time Constants +The following are the time constant names available in `usql`, corresponding time format value, and example display output: + +| Constant | Format | Display | +| ----------- | ------------------------------------: | ----------------------------------: | +| ANSIC | `Mon Jan _2 15:04:05 2006` | `Wed Aug 3 20:12:48 2022` | +| UnixDate | `Mon Jan _2 15:04:05 MST 2006` | `Wed Aug 3 20:12:48 UTC 2022` | +| RubyDate | `Mon Jan 02 15:04:05 -0700 2006` | `Wed Aug 03 20:12:48 +0000 2022` | +| RFC822 | `02 Jan 06 15:04 MST` | `03 Aug 22 20:12 UTC` | +| RFC822Z | `02 Jan 06 15:04 -0700` | `03 Aug 22 20:12 +0000` | +| RFC850 | `Monday, 02-Jan-06 15:04:05 MST` | `Wednesday, 03-Aug-22 20:12:48 UTC` | +| RFC1123 | `Mon, 02 Jan 2006 15:04:05 MST` | `Wed, 03 Aug 2022 20:12:48 UTC` | +| RFC1123Z | `Mon, 02 Jan 2006 15:04:05 -0700` | `Wed, 03 Aug 2022 20:12:48 +0000` | +| RFC3339 | `2006-01-02T15:04:05Z07:00` | `2022-08-03T20:12:48Z` | +| RFC3339Nano | `2006-01-02T15:04:05.999999999Z07:00` | `2022-08-03T20:12:48.693257Z` | +| Kitchen | `3:04PM` | `8:12PM` | +| Stamp | `Jan _2 15:04:05` | `Aug 3 20:12:48` | +| StampMilli | `Jan _2 15:04:05.000` | `Aug 3 20:12:48.693` | +| StampMicro | `Jan _2 15:04:05.000000` | `Aug 3 20:12:48.693257` | +| StampNano | `Jan _2 15:04:05.000000000` | `Aug 3 20:12:48.693257000` | From 9d674594792ad9f4f1c95b98a95c15e6e213e7fe Mon Sep 17 00:00:00 2001 From: JMARyA Date: Thu, 12 Dec 2024 08:54:48 +0100 Subject: [PATCH 08/99] add node exporter --- technology/applications/Applications.md | 1 + .../applications/utilities/node-exporter.md | 178 ++++++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 technology/applications/utilities/node-exporter.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index e384cdc..17c6488 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -118,6 +118,7 @@ rev: 2024-07-14 - [Wildcard](utilities/Wildcard.md) - [Textpieces](utilities/Textpieces.md) - [ImHex](utilities/ImHex.md) +- [Node Exporter](utilities/node-exporter.md) # Mobile - [Aegis](./utilities/Aegis.md) diff --git a/technology/applications/utilities/node-exporter.md b/technology/applications/utilities/node-exporter.md new file mode 100644 index 0000000..84a6975 --- /dev/null +++ b/technology/applications/utilities/node-exporter.md @@ -0,0 +1,178 @@ +--- +obj: application +repo: https://github.com/prometheus/node_exporter +rev: 2024-12-12 +--- + +# Prometheus Node Exporter +Prometheus exporter for hardware and OS metrics exposed by *NIX kernels, written in Go with pluggable metric collectors. + +A Dashboard to use with Node Exporter and Grafana can be found [here](https://grafana.com/grafana/dashboards/1860-node-exporter-full/). + +## Usage +The node_exporter listens on HTTP port 9100 by default. + +### Docker +The `node_exporter` is designed to monitor the host system. Deploying in containers requires extra care in order to avoid monitoring the container itself. + +For situations where containerized deployment is needed, some extra flags must be used to allow the `node_exporter` access to the host namespaces. + +Be aware that any non-root mount points you want to monitor will need to be bind-mounted into the container. + +If you start container for host monitoring, specify `path.rootfs` argument. This argument must match path in bind-mount of host root. The `node_exporter` will use `path.rootfs` as prefix to access host filesystem. + +```yml +--- +version: '3.8' + +services: + node_exporter: + image: quay.io/prometheus/node-exporter:latest + container_name: node_exporter + command: + - '--path.rootfs=/host' + network_mode: host + pid: host + restart: unless-stopped + volumes: + - '/:/host:ro,rslave' +``` + +On some systems, the timex collector requires an additional Docker flag, `--cap-add=SYS_TIME`, in order to access the required syscalls. + +### Prometheus +Configure Prometheus to scrape the exposed node exporter: + +```yml +global: + scrape_interval: 15s + +scrape_configs: +- job_name: node + static_configs: + - targets: ['localhost:9100'] +``` + +## Configuration +Node Exporter can be configured using CLI arguments. + +### Options + +| **Option** | **Description** | +| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------- | +| `--path.procfs="/proc"` | procfs mountpoint. | +| `--path.sysfs="/sys"` | sysfs mountpoint. | +| `--path.rootfs="/"` | rootfs mountpoint. | +| `--path.udev.data="/run/udev/data"` | udev data path. | +| `--collector.runit.servicedir="/etc/service"` | Path to runit service directory. | +| `--collector.supervisord.url="http://localhost:9001/RPC2"` | XML RPC endpoint. | +| `--collector.sysctl.include=COLLECTOR.SYSCTL.INCLUDE ...` | Select sysctl metrics to include. | +| `--collector.sysctl.include-info=COLLECTOR.SYSCTL.INCLUDE-INFO ...` | Select sysctl metrics to include as info metrics. | +| `--collector.systemd.unit-include=".+"` | Regexp of systemd units to include. Units must both match include and not match exclude to be included. | +| `--collector.systemd.unit-exclude=".+\\.(automount|device|mount|scope|slice|target)"` | Regexp of systemd units to exclude. Units must both match include and not match exclude to be included. | +| `--collector.systemd.enable-task-metrics` | Enables service unit tasks metrics `unit_tasks_current` and `unit_tasks_max`. | +| `--collector.systemd.enable-restarts-metrics` | Enables service unit metric `service_restart_total`. | +| `--collector.systemd.enable-start-time-metrics` | Enables service unit metric `unit_start_time_seconds`. | +| `--collector.tapestats.ignored-devices="^$"` | Regexp of devices to ignore for tapestats. | +| `--collector.textfile.directory="/var/lib/prometheus/node-exporter"` | Directory to read text files with metrics from. | +| `--collector.vmstat.fields="^(oom_kill|pgpg|pswp|pg.*fault).*"` | Regexp of fields to return for vmstat collector. | +| `--collector.arp` | Enable the arp collector (default: enabled). | +| `--collector.bcache` | Enable the bcache collector (default: enabled). | +| `--collector.bonding` | Enable the bonding collector (default: enabled). | +| `--collector.btrfs` | Enable the btrfs collector (default: enabled). | +| `--collector.buddyinfo` | Enable the buddyinfo collector (default: disabled). | +| `--collector.cgroups` | Enable the cgroups collector (default: disabled). | +| `--collector.conntrack` | Enable the conntrack collector (default: enabled). | +| `--collector.cpu` | Enable the cpu collector (default: enabled). | +| `--collector.cpufreq` | Enable the cpufreq collector (default: enabled). | +| `--collector.diskstats` | Enable the diskstats collector (default: enabled). | +| `--collector.dmi` | Enable the dmi collector (default: enabled). | +| `--collector.drbd` | Enable the drbd collector (default: disabled). | +| `--collector.drm` | Enable the drm collector (default: disabled). | +| `--collector.edac` | Enable the edac collector (default: enabled). | +| `--collector.entropy` | Enable the entropy collector (default: enabled). | +| `--collector.ethtool` | Enable the ethtool collector (default: disabled). | +| `--collector.fibrechannel` | Enable the fibrechannel collector (default: enabled). | +| `--collector.filefd` | Enable the filefd collector (default: enabled). | +| `--collector.filesystem` | Enable the filesystem collector (default: enabled). | +| `--collector.hwmon` | Enable the hwmon collector (default: enabled). | +| `--collector.infiniband` | Enable the infiniband collector (default: enabled). | +| `--collector.interrupts` | Enable the interrupts collector (default: disabled). | +| `--collector.ipvs` | Enable the ipvs collector (default: enabled). | +| `--collector.ksmd` | Enable the ksmd collector (default: disabled). | +| `--collector.lnstat` | Enable the lnstat collector (default: disabled). | +| `--collector.loadavg` | Enable the loadavg collector (default: enabled). | +| `--collector.logind` | Enable the logind collector (default: disabled). | +| `--collector.mdadm` | Enable the mdadm collector (default: enabled). | +| `--collector.meminfo` | Enable the meminfo collector (default: enabled). | +| `--collector.meminfo_numa` | Enable the meminfo_numa collector (default: disabled). | +| `--collector.mountstats` | Enable the mountstats collector (default: disabled). | +| `--collector.netclass` | Enable the netclass collector (default: enabled). | +| `--collector.netdev` | Enable the netdev collector (default: enabled). | +| `--collector.netstat` | Enable the netstat collector (default: enabled). | +| `--collector.network_route` | Enable the network_route collector (default: disabled). | +| `--collector.nfs` | Enable the nfs collector (default: enabled). | +| `--collector.nfsd` | Enable the nfsd collector (default: enabled). | +| `--collector.ntp` | Enable the ntp collector (default: disabled). | +| `--collector.nvme` | Enable the nvme collector (default: enabled). | +| `--collector.os` | Enable the os collector (default: enabled). | +| `--collector.perf` | Enable the perf collector (default: disabled). | +| `--collector.powersupplyclass` | Enable the powersupplyclass collector (default: enabled). | +| `--collector.pressure` | Enable the pressure collector (default: enabled). | +| `--collector.processes` | Enable the processes collector (default: disabled). | +| `--collector.qdisc` | Enable the qdisc collector (default: disabled). | +| `--collector.rapl` | Enable the rapl collector (default: enabled). | +| `--collector.runit` | Enable the runit collector (default: disabled). | +| `--collector.schedstat` | Enable the schedstat collector (default: enabled). | +| `--collector.selinux` | Enable the selinux collector (default: enabled). | +| `--collector.slabinfo` | Enable the slabinfo collector (default: disabled). | +| `--collector.sockstat` | Enable the sockstat collector (default: enabled). | +| `--collector.softnet` | Enable the softnet collector (default: enabled). | +| `--collector.stat` | Enable the stat collector (default: enabled). | +| `--collector.supervisord` | Enable the supervisord collector (default: disabled). | +| `--collector.sysctl` | Enable the sysctl collector (default: disabled). | +| `--collector.systemd` | Enable the systemd collector (default: enabled). | +| `--collector.tapestats` | Enable the tapestats collector (default: enabled). | +| `--collector.tcpstat` | Enable the tcpstat collector (default: disabled). | +| `--collector.textfile` | Enable the textfile collector (default: enabled). | +| `--collector.thermal_zone` | Enable the thermal_zone collector (default: enabled). | +| `--collector.time` | Enable the time collector (default: enabled). | +| `--collector.timex` | Enable the timex collector (default: enabled). | +| `--collector.udp_queues` | Enable the udp_queues collector (default: enabled). | +| `--collector.uname` | Enable the uname collector (default: enabled). | +| `--collector.vmstat` | Enable the vmstat collector (default: enabled). | +| `--collector.wifi` | Enable the wifi collector (default: disabled). | +| `--collector.xfs` | Enable the xfs collector (default: enabled). | +| `--collector.zfs` | Enable the zfs collector (default: enabled). | +| `--collector.zoneinfo` | Enable the zoneinfo collector (default: disabled). | +| `--web.telemetry-path="/metrics"` | Path under which to expose metrics. | +| `--web.disable-exporter-metrics` | Exclude metrics about the exporter itself (`promhttp_*`, `process_*`, `go_*`). | +| `--web.max-requests=40` | Maximum number of parallel scrape requests. Use 0 to disable. | +| `--collector.disable-defaults` | Set all collectors to disabled by default. | +| `--runtime.gomaxprocs=1` | The target number of CPUs Go will run on (`GOMAXPROCS`). | +| `--web.systemd-socket` | Use systemd socket activation listeners instead of port listeners (Linux only). | +| `--web.listen-address=:9100 ...` | Addresses on which to expose metrics and web interface. Repeatable for multiple addresses. | +| `--web.config.file=""` | [EXPERIMENTAL] Path to configuration file that can enable TLS or authentication. | +| `--log.level=info` | Only log messages with the given severity or above. One of: `[debug, info, warn, error]`. | +| `--log.format=logfmt` | Output format of log messages. One of: `[logfmt, json]`. | + +### Web Configuration +Exporters and services instrumented with the Exporter Toolkit share the same web configuration file format. This is experimental and might change in the future. + +To specify which web configuration file to load, use the `--web.config.file` flag. + +Basic config file: +```yml +# TLS and basic authentication configuration example. +# +# Additionally, a certificate and a key file are needed. +tls_server_config: + cert_file: server.crt + key_file: server.key + +# Usernames and passwords required to connect. +# Passwords are hashed with bcrypt: https://github.com/prometheus/exporter-toolkit/blob/master/docs/web-configuration.md#about-bcrypt. +basic_auth_users: + alice: $2y$10$mDwo.lAisC94iLAyP81MCesa29IzH37oigHC/42V2pdJlUprsJPze + bob: $2y$10$hLqFl9jSjoAAy95Z/zw8Ye8wkdMBM8c5Bn1ptYqP/AXyV0.oy0S8m +``` From f715b434026429e0128562ca8c227031b0d4bc27 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Thu, 12 Dec 2024 09:28:21 +0100 Subject: [PATCH 09/99] add grafana applications --- technology/applications/Applications.md | 3 +++ technology/applications/web/Grafana.md | 8 ++++++++ technology/applications/web/Prometheus.md | 8 ++++++++ technology/applications/web/loki.md | 8 ++++++++ 4 files changed, 27 insertions(+) create mode 100644 technology/applications/web/Grafana.md create mode 100644 technology/applications/web/Prometheus.md create mode 100644 technology/applications/web/loki.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 17c6488..2911a22 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -166,6 +166,9 @@ rev: 2024-07-14 - [Caddy](./web/Caddy.md) - [zigbee2MQTT](./web/zigbee2mqtt.md) - [dawarich](./web/dawarich.md) +- [Grafana](./web/Grafana.md) +- [Prometheus](./web/Prometheus.md) +- [Loki](./web/loki.md) # CLI ## Terminal diff --git a/technology/applications/web/Grafana.md b/technology/applications/web/Grafana.md new file mode 100644 index 0000000..49d8dbc --- /dev/null +++ b/technology/applications/web/Grafana.md @@ -0,0 +1,8 @@ +--- +obj: application +website: https://grafana.com +repo: https://github.com/grafana/grafana +--- + +# Grafana +#wip diff --git a/technology/applications/web/Prometheus.md b/technology/applications/web/Prometheus.md new file mode 100644 index 0000000..ce2e73f --- /dev/null +++ b/technology/applications/web/Prometheus.md @@ -0,0 +1,8 @@ +--- +obj: application +website: https://prometheus.io +repo: https://github.com/prometheus/prometheus +--- + +# Prometheus +#wip diff --git a/technology/applications/web/loki.md b/technology/applications/web/loki.md new file mode 100644 index 0000000..0e57bb1 --- /dev/null +++ b/technology/applications/web/loki.md @@ -0,0 +1,8 @@ +--- +obj: application +repo: https://github.com/grafana/loki +website: https://grafana.com/oss/loki +--- + +# Grafana Loki +#wip From 8289890ccde5d6982ec9a5fde959f39deaf3404b Mon Sep 17 00:00:00 2001 From: JMARyA Date: Thu, 12 Dec 2024 09:39:36 +0100 Subject: [PATCH 10/99] update prometheus --- technology/applications/web/Prometheus.md | 52 ++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/technology/applications/web/Prometheus.md b/technology/applications/web/Prometheus.md index ce2e73f..43cef86 100644 --- a/technology/applications/web/Prometheus.md +++ b/technology/applications/web/Prometheus.md @@ -2,7 +2,57 @@ obj: application website: https://prometheus.io repo: https://github.com/prometheus/prometheus +rev: 2024-12-12 --- # Prometheus -#wip +Prometheus is an open-source systems monitoring and alerting toolkit originally built at SoundCloud. +It collects and stores its metrics as time series data, i.e. metrics information is stored with the timestamp at which it was recorded, alongside optional key-value pairs called labels. +This data can then be visualized using [Grafana](./Grafana.md). + +## Docker Compose + +```yml +services: + prometheus: + image: prom/prometheus + ports: + - 9090:9090 + volumes: + - ./data:/prometheus + - ./conf:/etc/prometheus +``` + +## Configuration +Basic prometheus config: + +```yml +global: + scrape_interval: 15s + evaluation_interval: 15s + +scrape_configs: + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + + # Node Exporter Config + - job_name: node_exporter + scrape_interval: 5s + static_configs: + - targets: ['host:9100'] + + # Job with custom CA + - job_name: custom_ca + static_configs: + - targets: ['endpoint'] + tls_config: + ca_file: '/ca_file.crt' + + # Job with Bearer Auth + - job_name: bearer_auth + scrape_interval: 120s + static_configs: + - targets: ['endpoint'] + bearer_token: 'BEARER_TOKEN' +``` From 51859b61719280fe4219eb723f69f603a241a323 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Thu, 12 Dec 2024 09:48:42 +0100 Subject: [PATCH 11/99] add cadvisor --- technology/applications/Applications.md | 1 + technology/applications/utilities/cAdvisor.md | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 technology/applications/utilities/cAdvisor.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 2911a22..32b63e4 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -119,6 +119,7 @@ rev: 2024-07-14 - [Textpieces](utilities/Textpieces.md) - [ImHex](utilities/ImHex.md) - [Node Exporter](utilities/node-exporter.md) +- [cAdvisor](utilities/cAdvisor.md) # Mobile - [Aegis](./utilities/Aegis.md) diff --git a/technology/applications/utilities/cAdvisor.md b/technology/applications/utilities/cAdvisor.md new file mode 100644 index 0000000..4e7b248 --- /dev/null +++ b/technology/applications/utilities/cAdvisor.md @@ -0,0 +1,42 @@ +--- +obj: application +repo: https://github.com/google/cadvisor +rev: 2024-12-12 +--- + +# cAdvisor +cAdvisor (Container Advisor) provides container users an understanding of the resource usage and performance characteristics of their running containers. It is a running daemon that collects, aggregates, processes, and exports information about running containers. Specifically, for each container it keeps resource isolation parameters, historical resource usage, histograms of complete historical resource usage and network statistics. This data is exported by container and machine-wide. + +## Prometheus +Add this to [Prometheus](../web/Prometheus.md) config file: + +```yml +scrape_configs: +- job_name: cadvisor + scrape_interval: 5s + static_configs: + - targets: + - cadvisor:8080 +``` + +## Docker-Compose + +```yml +services: + cadvisor: + volumes: + - /:/rootfs:ro + - /var/run:/var/run:ro + - /sys:/sys:ro + - /var/lib/docker/:/var/lib/docker:ro + - /dev/disk/:/dev/disk:ro + ports: + - target: 8080 + published: 8080 + protocol: tcp + mode: host + privileged: true + image: gcr.io/cadvisor/cadvisor + deploy: + mode: global +``` From b0c4d4e19c40afbdec6fd949a3c7c412e84d3e80 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 16 Dec 2024 08:59:39 +0100 Subject: [PATCH 12/99] update tmux --- technology/applications/cli/tmux.md | 43 +++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/technology/applications/cli/tmux.md b/technology/applications/cli/tmux.md index 4389010..baac2e8 100644 --- a/technology/applications/cli/tmux.md +++ b/technology/applications/cli/tmux.md @@ -3,16 +3,18 @@ obj: application repo: https://github.com/tmux/tmux arch-wiki: https://wiki.archlinux.org/title/tmux wiki: https://en.wikipedia.org/wiki/Tmux -rev: 2024-01-15 +rev: 2024-12-16 --- # tmux -tmux is a terminal multiplexer: it enables a number of terminals to be created, accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached. +tmux is a terminal multiplexer: it enables a number of terminals to be created, accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached. # Usage **New tmux session:** ```shell +tmux tmux new -s name +tmux new -s mysession -n mywindow ``` **List existing sessions:** @@ -23,6 +25,7 @@ tmux ls **Attach to a named session:** ```shell tmux attach -t name +tmux a -t name ``` **Kill a session:** @@ -31,14 +34,30 @@ tmux kill-session -t name ``` # Keybinds -- Vertical Split: `Ctrl-b %` -- Horizontal Split: `Ctrl-b "` -- Select Pane: `Ctrl-b q [num]` -- Change Pane Size: `Ctrl-b Ctrl [Down/Up/Left/Right]` -- Switch sessions: `Ctrl-b s` +- Show the time: `Ctrl-b + t` + +## Sessions +- Rename current session: `Ctrl-b + $` - Detach from a running session: `Ctrl-b + d` -- Create a new window inside session: `Ctrl-b c` -- Go to next window: `Ctrl-b n` -- Switch sessions and windows: `Ctrl-B w` -- Go to window: `Ctrl-b [0-9]` -- Kill a window: `Ctrl-b x` \ No newline at end of file +- Sessions and windows overview: `Ctrl-b + w` +- Move to previous session: `Ctrl-b + (` +- Move to next session: `Ctrl-b + )` +- Switch sessions: `Ctrl-b + s` + +## Windows +- Create a new window: `Ctrl-b + c` +- Rename current window: `Ctrl-b + ,` +- Go to previous window: `Ctrl-b + p` +- Go to next window: `Ctrl-b + n` +- Go to window: `Ctrl-b + [0-9]` + +## Panes +- Vertical Split: `Ctrl-b + %` +- Horizontal Split: `Ctrl-b + "` +- Select Pane: `Ctrl-b + q + [num]` +- Change Pane Size: `Ctrl-b + Ctrl + [Down/Up/Left/Right]` +- Move current pane left: `Ctrl-b + {` +- Move current pane right: `Ctrl-b + }` +- Close current pane: `Ctrl-b + x` +- Switch to the next pane: `Ctrl-b + o` +- Convert pane into a window: `Ctrl-b + !` From 619913dec317b0ee856e413743fc50c49e991046 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 16 Dec 2024 09:45:52 +0100 Subject: [PATCH 13/99] add ogp --- technology/internet/OpenGraphProtocol.md | 251 +++++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 technology/internet/OpenGraphProtocol.md diff --git a/technology/internet/OpenGraphProtocol.md b/technology/internet/OpenGraphProtocol.md new file mode 100644 index 0000000..6bd467b --- /dev/null +++ b/technology/internet/OpenGraphProtocol.md @@ -0,0 +1,251 @@ +--- +obj: concept +website: https://ogp.me +rev: 2024-12-16 +--- + +# The Open Graph protocol +The [Open Graph protocol](https://ogp.me/) enables any web page to become a rich object in a social graph. For instance, this is used on Facebook to allow any web page to have the same functionality as any other object on Facebook. + +## Basic Metadata +To turn your web pages into graph objects, you need to add basic metadata to your page. Which means that you'll place additional `` tags in the `` of your web page. The four required properties for every page are: + +- `og:title` - The title of your object as it should appear within the graph, e.g., "The Rock". +- `og:type` - The type of your object, e.g., `video.movie`. Depending on the type you specify, other properties may also be required. +- `og:image` - An image URL which should represent your object within the graph. +- `og:url` - The canonical URL of your object that will be used as its permanent ID in the graph, e.g., "https://www.imdb.com/title/tt0117500/". + +As an example, the following is the Open Graph protocol markup for [The Rock on IMDB](https://www.imdb.com/title/tt0117500/): + +```html + + +The Rock (1996) + + + + +... + +... + +``` + +### Optional Metadata +The following properties are optional for any object and are generally recommended: + +- `og:audio` - A URL to an audio file to accompany this object. +- `og:description` - A one to two sentence description of your object. +- `og:determiner` - The word that appears before this object's title in a sentence. An enum of (`a`, `an`, `the`, `""`, `auto`). If `auto` is chosen, the consumer of your data should chose between `a` or `an`. Default is `""` (blank). +- `og:locale` - The locale these tags are marked up in. Of the format `language_TERRITORY`. Default is `en_US`. +- `og:locale:alternate` - An array of other locales this page is available in. +- `og:site_name` - If your object is part of a larger web site, the name which should be displayed for the overall site. e.g., "IMDb". +- `og:video` - A URL to a video file that complements this object. + +For example (line-break solely for display purposes): + +```html + + + + + + + + +``` + +## Structured Properties +Some properties can have extra metadata attached to them. These are specified in the same way as other metadata with `property` and `content`, but the `property` will have extra `:`. + +The `og:image` property has some optional structured properties: + +- `og:image:url` - Identical to `og:image`. +- `og:image:secure_url` - An alternate url to use if the webpage requires HTTPS. +- `og:image:type` - A MIME type for this image. +- `og:image:width` - The number of pixels wide. +- `og:image:height` - The number of pixels high. +- `og:image:alt` - A description of what is in the image (not a caption). If the page specifies an og:image it should specify `og:image:alt`. + +A full image example: + +```html + + + + + + +``` + +The `og:video` tag has the identical tags as `og:image`. Here is an example: + +```html + + + + + +``` + +The `og:audio` tag only has the first 3 properties available (since size doesn't make sense for sound): + +```html + + + +``` + +## Arrays +If a tag can have multiple values, just put multiple versions of the same `` tag on your page. The first tag (from top to bottom) is given preference during conflicts. + +```html + + +``` + +Put structured properties after you declare their root tag. Whenever another root element is parsed, that structured property is considered to be done and another one is started. + +For example: + +```html + + + + + + +``` + +means there are 3 images on this page, the first image is `300x300`, the middle one has unspecified dimensions, and the last one is `1000px` tall. + +## Object Types +In order for your object to be represented within the graph, you need to specify its type. This is done using the `og:type` property: + +```html + +``` + +When the community agrees on the schema for a type, it is added to the list of global types. All other objects in the type system are CURIEs of the form. + +```html + + +``` + +The global types are grouped into verticals. Each vertical has its own namespace. The `og:type` values for a namespace are always prefixed with the namespace and then a period. This is to reduce confusion with user-defined namespaced types which always have colons in them. + +### Music + +- Namespace URI: [`https://ogp.me/ns/music#`](https://ogp.me/ns/music) + +`og:type` values: + +[`music.song`](https://ogp.me/#type_music.song) + +- `music:duration` - [integer](https://ogp.me/#integer) >=1 - The song's length in seconds. +- `music:album` - [music.album](https://ogp.me/#type_music.album) [array](https://ogp.me/#array) - The album this song is from. +- `music:album:disc` - [integer](https://ogp.me/#integer) >=1 - Which disc of the album this song is on. +- `music:album:track` - [integer](https://ogp.me/#integer) >=1 - Which track this song is. +- `music:musician` - [profile](https://ogp.me/#type_profile) [array](https://ogp.me/#array) - The musician that made this song. + +[`music.album`](https://ogp.me/#type_music.album) + +- `music:song` - [music.song](https://ogp.me/#type_music.song) - The song on this album. +- `music:song:disc` - [integer](https://ogp.me/#integer) >=1 - The same as `music:album:disc` but in reverse. +- `music:song:track` - [integer](https://ogp.me/#integer) >=1 - The same as `music:album:track` but in reverse. +- `music:musician` - [profile](https://ogp.me/#type_profile) - The musician that made this song. +- `music:release_date` - [datetime](https://ogp.me/#datetime) - The date the album was released. + +[`music.playlist`](https://ogp.me/#type_music.playlist) + +- `music:song` - Identical to the ones on [music.album](https://ogp.me/#type_music.album) +- `music:song:disc` +- `music:song:track` +- `music:creator` - [profile](https://ogp.me/#type_profile) - The creator of this playlist. + +[`music.radio_station`](https://ogp.me/#type_music.radio_station) + +- `music:creator` - [profile](https://ogp.me/#type_profile) - The creator of this station. + +### Video + +- Namespace URI: [`https://ogp.me/ns/video#`](https://ogp.me/ns/video) + +`og:type` values: + +[`video.movie`](https://ogp.me/#type_video.movie) + +- `video:actor` - [profile](https://ogp.me/#type_profile) [array](https://ogp.me/#array) - Actors in the movie. +- `video:actor:role` - [string](https://ogp.me/#string) - The role they played. +- `video:director` - [profile](https://ogp.me/#type_profile) [array](https://ogp.me/#array) - Directors of the movie. +- `video:writer` - [profile](https://ogp.me/#type_profile) [array](https://ogp.me/#array) - Writers of the movie. +- `video:duration` - [integer](https://ogp.me/#integer) >=1 - The movie's length in seconds. +- `video:release_date` - [datetime](https://ogp.me/#datetime) - The date the movie was released. +- `video:tag` - [string](https://ogp.me/#string) [array](https://ogp.me/#array) - Tag words associated with this movie. + +[`video.episode`](https://ogp.me/#type_video.episode) + +- `video:actor` - Identical to [video.movie](https://ogp.me/#type_video.movie) +- `video:actor:role` +- `video:director` +- `video:writer` +- `video:duration` +- `video:release_date` +- `video:tag` +- `video:series` - [video.tv_show](https://ogp.me/#type_video.tv_show) - Which series this episode belongs to. + +[`video.tv_show`](https://ogp.me/#type_video.tv_show) + +A multi-episode TV show. The metadata is identical to [video.movie](https://ogp.me/#type_video.movie). + +[`video.other`](https://ogp.me/#type_video.other) + +A video that doesn't belong in any other category. The metadata is identical to [video.movie](https://ogp.me/#type_video.movie). + +### No Vertical +These are globally defined objects that just don't fit into a vertical but yet are broadly used and agreed upon. + +`og:type` values: + +[`article`](https://ogp.me/#type_article) - Namespace URI: [`https://ogp.me/ns/article#`](https://ogp.me/ns/article) + +- `article:published_time` - [datetime](https://ogp.me/#datetime) - When the article was first published. +- `article:modified_time` - [datetime](https://ogp.me/#datetime) - When the article was last changed. +- `article:expiration_time` - [datetime](https://ogp.me/#datetime) - When the article is out of date after. +- `article:author` - [profile](https://ogp.me/#type_profile) [array](https://ogp.me/#array) - Writers of the article. +- `article:section` - [string](https://ogp.me/#string) - A high-level section name. E.g. Technology +- `article:tag` - [string](https://ogp.me/#string) [array](https://ogp.me/#array) - Tag words associated with this article. + +[`book`](https://ogp.me/#type_book) - Namespace URI: [`https://ogp.me/ns/book#`](https://ogp.me/ns/book) + +- `book:author` - [profile](https://ogp.me/#type_profile) [array](https://ogp.me/#array) - Who wrote this book. +- `book:isbn` - [string](https://ogp.me/#string) - The [ISBN](https://en.wikipedia.org/wiki/International_Standard_Book_Number) +- `book:release_date` - [datetime](https://ogp.me/#datetime) - The date the book was released. +- `book:tag` - [string](https://ogp.me/#string) [array](https://ogp.me/#array) - Tag words associated with this book. + +[`profile`](https://ogp.me/#type_profile) - Namespace URI: [`https://ogp.me/ns/profile#`](https://ogp.me/ns/profile) + +- `profile:first_name` - [string](https://ogp.me/#string) - A name normally given to an individual by a parent or self-chosen. +- `profile:last_name` - [string](https://ogp.me/#string) - A name inherited from a family or marriage and by which the individual is commonly known. +- `profile:username` - [string](https://ogp.me/#string) - A short unique string to identify them. +- `profile:gender` - [enum](https://ogp.me/#enum)(male, female) - Their gender. + +[`website`](https://ogp.me/#type_website) - Namespace URI: [`https://ogp.me/ns/website#`](https://ogp.me/ns/website) + +No additional properties other than the basic ones. Any non-marked up webpage should be treated as `og:type` website. + +## Types +The following types are used when defining attributes in Open Graph protocol. + +| **Type** | **Description** | **Literals** | +| -------- | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | +| Boolean | A Boolean represents a true or false value | true, false, 1, 0 | +| DateTime | A DateTime represents a temporal value composed of a date (year, month, day) and an optional time component (hours, minutes) | ISO 8601 | +| Enum | A type consisting of bounded set of constant string values (enumeration members). | A string value that is a member of the enumeration | +| Float | A 64-bit signed floating point number | All literals that conform to the following formats: `1.234`, `-1.234`, `1.2e3`, `-1.2e3`, `7E-10` | +| Integer | A 32-bit signed integer. | All literals that conform to the following formats: `1234`, `-123` | +| String | A sequence of Unicode characters | All literals composed of Unicode characters with no escape characters | +| URL | A sequence of Unicode characters that identify an Internet resource. | All valid URLs that utilize the `http://` or `https://` protocols | From 064dc6c5d3ca3866bfc65934aeded4274dc6183e Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 16 Dec 2024 10:30:51 +0100 Subject: [PATCH 14/99] add url api --- .../programming/patterns/Programming Patterns.md | 3 +++ .../dev/programming/patterns/URL Suffix API.md | 15 +++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 technology/dev/programming/patterns/URL Suffix API.md diff --git a/technology/dev/programming/patterns/Programming Patterns.md b/technology/dev/programming/patterns/Programming Patterns.md index 1099afe..de23d37 100644 --- a/technology/dev/programming/patterns/Programming Patterns.md +++ b/technology/dev/programming/patterns/Programming Patterns.md @@ -2,6 +2,9 @@ obj: meta/collection --- +# Best Practices +- [URL Suffix API](./URL%20Suffix%20API.md) + # Creational Patterns - [Abstract Factory](creational/Abstract%20Factory%20Pattern.md) - [Builder](creational/Builder%20Pattern.md) diff --git a/technology/dev/programming/patterns/URL Suffix API.md b/technology/dev/programming/patterns/URL Suffix API.md new file mode 100644 index 0000000..5214f4a --- /dev/null +++ b/technology/dev/programming/patterns/URL Suffix API.md @@ -0,0 +1,15 @@ +# URL Suffix API +When designing a website, consider leveraging URL suffixes to indicate the format of the resource being accessed, similar to how file extensions are used in operating systems. + +For example, a webpage located at `/blog/post/id` that renders human-readable content could have its machine-readable data served by appending a format-specific suffix to the same URL, such as `/blog/post/id.json`. + +#### Benefits: + +1. **Intuitive API from Website Usage** + Users can easily derive API endpoints from existing website URLs by appending the desired format suffix. + +2. **Interchangeable Formats** + The same approach allows for multiple formats (e.g., `.json`, `.msgpack`, `.protobuf`) to be supported seamlessly, improving flexibility and usability. + + +This method simplifies the architecture, enhances consistency, and provides an elegant mechanism to serve both human-readable and machine-readable content from the same base URL. \ No newline at end of file From c85814db1af65eb7c2350162411ac74a557f75cf Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 16 Dec 2024 16:20:32 +0100 Subject: [PATCH 15/99] add sbctl + systemd-cryptenroll --- technology/applications/Applications.md | 2 + technology/linux/mkinitcpio.md | 46 +++++-- technology/linux/sbctl.md | 57 ++++++++ .../linux/systemd/systemd-cryptenroll.md | 130 ++++++++++++++++++ 4 files changed, 221 insertions(+), 14 deletions(-) create mode 100644 technology/linux/sbctl.md create mode 100644 technology/linux/systemd/systemd-cryptenroll.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 36d6fe3..9b556b4 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -249,6 +249,8 @@ rev: 2024-12-10 - [mergerfs](../linux/filesystems/MergerFS.md) - [sshfs](../linux/filesystems/SSHFS.md) - [wine](../windows/Wine.md) +- [sbctl](../linux/sbctl.md) +- [systemd-cryptenroll](../linux/systemd/systemd-cryptenroll.md) ## Development - [act](./development/act.md) diff --git a/technology/linux/mkinitcpio.md b/technology/linux/mkinitcpio.md index 3229342..21d8ab7 100644 --- a/technology/linux/mkinitcpio.md +++ b/technology/linux/mkinitcpio.md @@ -1,5 +1,7 @@ --- obj: concept +arch-wiki: https://wiki.archlinux.org/title/Mkinitcpio +rev: 2024-12-16 --- # mkinitcpio @@ -8,20 +10,11 @@ The initial ramdisk is in essence a very small environment (early userspace) whi ## Configuration The primary configuration file for _mkinitcpio_ is `/etc/mkinitcpio.conf`. Additionally, preset definitions are provided by kernel packages in the `/etc/mkinitcpio.d` directory (e.g. `/etc/mkinitcpio.d/linux.preset`). -`MODULES` -Kernel modules to be loaded before any boot hooks are run. - -`BINARIES` -Additional binaries to be included in the initramfs image. - -`FILES` -Additional files to be included in the initramfs image. - -`HOOKS` -Hooks are scripts that execute in the initial ramdisk. - -`COMPRESSION` -Used to compress the initramfs image. +- `MODULES` : Kernel modules to be loaded before any boot hooks are run. +- `BINARIES` : Additional binaries to be included in the initramfs image. +- `FILES` : Additional files to be included in the initramfs image. +- `HOOKS` : Hooks are scripts that execute in the initial ramdisk. +- `COMPRESSION` : Used to compress the initramfs image. ### MODULES The `MODULES` array is used to specify modules to load before anything else is done. @@ -61,3 +54,28 @@ The default `HOOKS` setting should be sufficient for most simple, single disk se | **lvm2** | Adds the device mapper kernel module and the `lvm` tool to the image. | | **fsck** | Adds the fsck binary and file system-specific helpers to allow running fsck against your root device (and `/usr` if separate) prior to mounting. If added after the **autodetect** hook, only the helper specific to your root file system will be added. Usage of this hook is **strongly** recommended, and it is required with a separate `/usr` partition. It is highly recommended that if you include this hook that you also include any necessary modules to ensure your keyboard will work in early userspace. | | **filesystems** | This includes necessary file system modules into your image. This hook is **required** unless you specify your file system modules in `MODULES`. | + +### UKI +A Unified Kernel Image (UKI) is a single executable file that can be directly booted by UEFI firmware or automatically sourced by boot-loaders. + +In essence, a UKI combines all the necessary components for the operating system to start up, including: +- EFI stub loader +- Kernel command line +- Microcode updates +- Initramfs image (initial RAM file system) +- Kernel image itself +- Splash screen + +To enable the UKI edit `/etc/mkinitcpio.d/linux.preset`: + +```sh +default_uki="/boot/EFI/Linux/arch-linux.efi" + +fallback_uki="/boot/EFI/Linux/arch-linux-fallback.efi" +``` + +Build the Unified Kernel Image: + +```sh +mkinitcpio --allpresets +``` diff --git a/technology/linux/sbctl.md b/technology/linux/sbctl.md new file mode 100644 index 0000000..e6403a9 --- /dev/null +++ b/technology/linux/sbctl.md @@ -0,0 +1,57 @@ +--- +obj: application +repo: https://github.com/Foxboron/sbctl +rev: 2024-12-16 +--- + +# sbctl (Secure Boot Manager) +sbctl intends to be a user-friendly secure boot key manager capable of setting up secure boot, offer key management capabilities, and keep track of files that needs to be signed in the boot chain. + +## Usage +Install the necessary packages: +```sh +pacman -S sbctl sbsigntools +``` + +Check that Secure Boot "Setup Mode" is "Enabled" in UEFI: +```sh +sbctl status +``` + +Create your own signing keys: +```sh +sbctl create-keys +``` + +Sign the systemd bootloader: +```sh +sbctl sign -s \ + -o /usr/lib/systemd/boot/efi/systemd-bootx64.efi.signed \ + /usr/lib/systemd/boot/efi/systemd-bootx64.efi +``` + +Enroll your custom keys: +```sh +sbctl enroll-keys + +# Enroll and include Microsoft Keys +sbctl enroll-keys --microsoft +``` + +Sign EFI files: +```sh +sbctl sign -s /boot/EFI/Linux/arch-linux.efi +sbctl sign -s /boot/EFI/Linux/arch-linux-fallback.efi +sbctl sign -s /efi/EFI/systemd/systemd-bootx64.efi +sbctl sign -s /efi/EFI/Boot/bootx64.efi +``` + +Verify signature of EFI files: +```sh +sbctl verify +``` + +Resign everything: +```sh +sbctl sign-all +``` diff --git a/technology/linux/systemd/systemd-cryptenroll.md b/technology/linux/systemd/systemd-cryptenroll.md new file mode 100644 index 0000000..de126dc --- /dev/null +++ b/technology/linux/systemd/systemd-cryptenroll.md @@ -0,0 +1,130 @@ +--- +obj: application +arch-wiki: https://wiki.archlinux.org/title/Systemd-cryptenroll +rev: 2024-12-16 +--- + +# systemd-cryptenroll +systemd-cryptenroll allows enrolling smartcards, FIDO2 tokens and Trusted Platform Module security chips into LUKS devices, as well as regular passphrases. These devices are later unlocked by `systemd-cryptsetup@.service`, using the enrolled tokens. + +## Usage + +### **List keyslots** +systemd-cryptenroll can list the keyslots in a LUKS device, similar to cryptsetup luksDump, but in a more user-friendly format. + +```sh +$ systemd-cryptenroll /dev/disk + +SLOT TYPE + 0 password + 1 tpm2 +``` + +### **Erasing keyslots** + +```sh +systemd-cryptenroll /dev/disk --wipe-slot=SLOT +``` + +Where `SLOT` can be: +- A single keyslot index +- A type of keyslot, which will erase all keyslots of that type. Valid types are `empty`, `password`, `recovery`, `pkcs11`, `fido2`, `tpm2` +- A combination of all of the above, separated by commas +- The string `all`, which erases all keyslots on the device. This option can only be used when enrolling another device or passphrase at the same time. + +The `--wipe-slot` operation can be used in combination with all enrollment options, which is useful to update existing device enrollments: + +```sh +systemd-cryptenroll /dev/disk --wipe-slot=fido2 --fido2-device=auto +``` + +### **Enrolling passphrases** +#### Regular password +This is equivalent to `cryptsetup luksAddKey`. + +```sh +systemd-cryptenroll /dev/disk --password +``` + +#### Recovery key +Recovery keys are mostly identical to passphrases, but are computer-generated instead of being chosen by a human, and thus have a guaranteed high entropy. The key uses a character set that is easy to type in, and may be scanned off screen via a QR code. + +A recovery key is designed to be used as a fallback if the hardware tokens are unavailable, and can be used in place of regular passphrases whenever they are required. + +```sh +systemd-cryptenroll /dev/disk --recovery-key +``` + +### Enrolling hardware devices +The `--type-device` options must point to a valid device path of their respective type. A list of available devices can be obtained by passing the list argument to this option. Alternatively, if you only have a single device of the desired type connected, the auto option can be used to automatically select it. + +#### PKCS#11 tokens or smartcards +The token or smartcard must contain a RSA key pair, which will be used to encrypt the generated key that will be used to unlock the volume. + +```sh +systemd-cryptenroll /dev/disk --pkcs11-token-uri=device +``` + +#### FIDO2 tokens +Any FIDO2 token that supports the "hmac-secret" extension can be used with systemd-cryptenroll. The following example would enroll a FIDO2 token to an encrypted LUKS2 block device, requiring only user presence as authentication. + +```sh +systemd-cryptenroll /dev/disk --fido2-device=device --fido2-with-client-pin=no +``` + +In addition, systemd-cryptenroll supports using the token's built-in user verification methods: +- `--fido2-with-user-presence` defines whether to verify the user presence (i.e. by tapping the token) before unlocking, defaults to `yes` +- `--fido2-with-user-verification` defines whether to require user verification before unlocking, defaults to `no` + +By default, the cryptographic algorithm used when generating a FIDO2 credential is es256 which denotes Elliptic Curve Digital Signature Algorithm (ECDSA) over NIST P-256 with SHA-256. If desired and provided by the FIDO2 token, a different cryptographic algorithm can be specified during enrollment. + +Suppose that a previous FIDO2 token has already been enrolled and the user wishes to enroll another, the following generates an eddsa credential which denotes EdDSA over Curve25519 with SHA-512 and authenticates the device with a previous enrolled token instead of a password. + +```sh +systemd-cryptenroll /dev/disk --fido2-device=device --fido2-credential-algorithm=eddsa --unlock-fido2-device=auto +``` + +#### Trusted Platform Module +systemd-cryptenroll has native support for enrolling LUKS keys in TPMs. It requires the following: +- `tpm2-tss` must be installed, +- A LUKS2 device (currently the default type used by cryptsetup), +- If you intend to use this method on your root partition, some tweaks need to be made to the initramfs + +To begin, run the following command to list your installed TPMs and the driver in use: + +```sh +systemd-cryptenroll --tpm2-device=list +``` + +> **Tip**: If your computer has multiple TPMs installed, specify the one you wish to use with `--tpm2-device=/path/to/tpm2_device` in the following steps. + +A key may be enrolled in both the TPM and the LUKS volume using only one command. The following example generates a new random key, adds it to the volume so it can be used to unlock it in addition to the existing keys, and binds this new key to PCR 7 (Secure Boot state): + +```sh +systemd-cryptenroll --tpm2-device=auto /dev/sdX +``` + +where `/dev/sdX` is the full path to the encrypted LUKS volume. Use `--unlock-key-file=/path/to/keyfile` if the LUKS volume is unlocked by a keyfile instead of a passphrase. + +> Note: It is possible to require a PIN to be entered in addition to the TPM state being correct. Simply add the option `--tpm2-with-pin=yes` to the command above and enter the PIN when prompted. + +To check that the new key was enrolled, dump the LUKS configuration and look for a systemd-tpm2 token entry, as well as an additional entry in the Keyslots section: + +```sh +cryptsetup luksDump /dev/sdX +``` + +To test that the key works, run the following command while the LUKS volume is closed: + +```sh +systemd-cryptsetup attach mapping_name /dev/sdX none tpm2-device=auto +``` + +where `mapping_name` is your chosen name for the volume once opened. + +##### Modules +If your TPM requires a kernel module, edit `/etc/mkinitcpio.conf` and edit the `MODULES` line to add the module used by your TPM. For instance: + +```sh +MODULES=(tpm_tis) +``` From e3a4a1a7d78ffc201a18c00660b1a0d2867e3158 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Tue, 17 Dec 2024 10:56:02 +0100 Subject: [PATCH 16/99] update systemd --- technology/linux/systemd/Systemd.md | 1 + technology/linux/systemd/systemd-boot.md | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/technology/linux/systemd/Systemd.md b/technology/linux/systemd/Systemd.md index 8442c8b..c508346 100644 --- a/technology/linux/systemd/Systemd.md +++ b/technology/linux/systemd/Systemd.md @@ -12,6 +12,7 @@ systemd is a suite of basic building blocks for a [Linux](../Linux.md) system. I See also: - [Systemd-Timers](Systemd-Timers.md) - [systemd-boot](systemd-boot.md) +- [systemd-cryptenroll](systemd-cryptenroll.md) ## Using Units Units commonly include, but are not limited to, services (_.service_), mount points (_.mount_), devices (_.device_) and sockets (_.socket_). diff --git a/technology/linux/systemd/systemd-boot.md b/technology/linux/systemd/systemd-boot.md index f769da2..9b54efa 100644 --- a/technology/linux/systemd/systemd-boot.md +++ b/technology/linux/systemd/systemd-boot.md @@ -1,6 +1,7 @@ --- obj: application arch-wiki: https://wiki.archlinux.org/title/Systemd-boot +rev: 2024-12-17 --- # Systemd Boot @@ -20,7 +21,8 @@ bootctl update ``` ## Configuration -The loader configuration is stored in the file `_esp_/loader/loader.conf` +The loader configuration is stored in the file `_esp_/loader/loader.conf`. + Example: ``` default arch.conf @@ -30,7 +32,7 @@ editor no ``` ### Adding loaders -_systemd-boot_ will search for boot menu items in `_esp_/loader/entries/*.conf` +_systemd-boot_ will search for boot menu items in `_esp_/loader/entries/*.conf`. Values: - `title` : Name @@ -57,4 +59,18 @@ systemctl reboot --boot-loader-entry=arch-custom.conf Firmware Setup: ```shell systemctl reboot --firmware-setup -``` \ No newline at end of file +``` + +## Keybindings +While the menu is shown, the following keys are active: + +| Key | Description | +| ------------- | ----------------------------------------------------------------------------------- | +| `Up` / `Down` | Select menu entry | +| `Enter` | Boot the selected entry | +| `d` | select the default entry to boot (stored in a non-volatile EFI variable) | +| `t` / `T` | adjust the timeout (stored in a non-volatile EFI variable) | +| `e` | edit the option line (kernel command line) for this bootup to pass to the EFI image | +| `Q` | quit | +| `v` | show the systemd-boot and UEFI version | +| `P` | print the current configuration to the console | From d34710f673427d9dac49cc6251c281cada19438c Mon Sep 17 00:00:00 2001 From: JMARyA Date: Tue, 17 Dec 2024 10:57:31 +0100 Subject: [PATCH 17/99] add sddm --- technology/applications/Applications.md | 1 + technology/applications/desktops/SDDM.md | 71 ++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 technology/applications/desktops/SDDM.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 9b556b4..010685c 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -38,6 +38,7 @@ rev: 2024-12-10 ## Desktop - [KDE Plasma](./desktops/KDE%20Plasma.md) +- [SDDM](./desktops/SDDM.md) - [dwm](./desktops/dwm.md) - [picom](./desktops/picom.md) - [Hyprland](./desktops/hyprland.md) diff --git a/technology/applications/desktops/SDDM.md b/technology/applications/desktops/SDDM.md new file mode 100644 index 0000000..aeb1cd4 --- /dev/null +++ b/technology/applications/desktops/SDDM.md @@ -0,0 +1,71 @@ +--- +obj: application +arch-wiki: https://wiki.archlinux.org/title/SDDM +wiki: https://en.wikipedia.org/wiki/Simple_Desktop_Display_Manager +repo: https://github.com/sddm/sddm +rev: 2024-12-17 +--- + +# SDDM +The Simple Desktop Display Manager (SDDM) is a display manager. It is the recommended display manager for the KDE Plasma and LXQt desktop environments. + +## Configuration +The default configuration file for SDDM can be found at `/usr/lib/sddm/sddm.conf.d/default.conf`. For any changes, create configuration file(s) in `/etc/sddm.conf.d/`. + +Everything should work out of the box, since Arch Linux uses systemd and SDDM defaults to using `systemd-logind` for session management. + +### Autologin +SDDM supports automatic login through its configuration file, for example (`/etc/sddm.conf.d/autologin.conf`): + +```ini +[Autologin] +User=john +Session=plasma + +# Optionally always relogin the user on logout +Relogin=true +``` + +This configuration causes a KDE Plasma session to be started for user `john` when the system is booted. Available session types can be found in `/usr/share/xsessions/` for X and in `/usr/share/wayland-sessions/` for Wayland. + +To autologin into KDE Plasma while simultaneously locking the session (e.g. to allow autostarted apps to warm up), create a systemd user unit drop in to pass `--lockscreen` in `plasma-ksmserver.service` (`~/.config/systemd/user/plasma-ksmserver.service.d/override.conf`): + +```ini +[Service] +ExecStart= +ExecStart=/usr/bin/ksmserver --lockscreen +``` + +### Theme settings +Theme settings can be changed in the `[Theme]` section. If you use Plasma's system settings, themes may show previews. + +Set to `breeze` for the default Plasma theme. + +#### Current theme + +Set the current theme through the Current value, e.g. `Current=archlinux-simplyblack`. + +#### Editing themes +The default SDDM theme directory is `/usr/share/sddm/themes/`. You can add your custom made themes to that directory under a separate subdirectory. Note that SDDM requires these subdirectory names to be the same as the theme names. Study the files installed to modify or create your own theme. + +#### Customizing a theme +To override settings in the `theme.conf` configuration file, create a custom `theme.conf.user` file in the same directory. For example, to change the theme's background (`/usr/share/sddm/themes/name/theme.conf.user`): + +```ini +[General] +background=/path/to/background.png +``` + +#### Testing (previewing) a theme +You can preview an SDDM theme if needed. This is especially helpful if you are not sure how the theme would look if selected or just edited a theme and want to see how it would look without logging out. You can run something like this: + +```sh +sddm-greeter-qt6 --test-mode --theme /usr/share/sddm/themes/breeze +``` + +This should open a new window for every monitor you have connected and show a preview of the theme. + +#### Mouse cursor +To set the mouse cursor theme, set `CursorTheme` to your preferred cursor theme. + +Valid Plasma mouse cursor theme names are `breeze_cursors`, `Breeze_Snow` and `breeze-dark`. From e0ff5de7463b559b1f1d8ca6ccca378a08823cfe Mon Sep 17 00:00:00 2001 From: JMARyA Date: Tue, 17 Dec 2024 14:24:37 +0100 Subject: [PATCH 18/99] add tmpfs --- technology/linux/filesystems/Filesystems.md | 1 + technology/linux/filesystems/tmpFS.md | 30 +++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 technology/linux/filesystems/tmpFS.md diff --git a/technology/linux/filesystems/Filesystems.md b/technology/linux/filesystems/Filesystems.md index 6477868..a1ad939 100644 --- a/technology/linux/filesystems/Filesystems.md +++ b/technology/linux/filesystems/Filesystems.md @@ -14,6 +14,7 @@ obj: meta/collection - [MergerFS](MergerFS.md) - [LVM](./LVM.md) - [LUKS](./LUKS.md) +- [tmpFS](./tmpFS.md) ## Network - [SSHFS](SSHFS.md) diff --git a/technology/linux/filesystems/tmpFS.md b/technology/linux/filesystems/tmpFS.md new file mode 100644 index 0000000..23e9bf7 --- /dev/null +++ b/technology/linux/filesystems/tmpFS.md @@ -0,0 +1,30 @@ +--- +obj: filesystem +wiki: https://en.wikipedia.org/wiki/Tmpfs +arch-wiki: https://wiki.archlinux.org/title/Tmpfs +--- + +# tmpFS +tmpfs is a temporary filesystem that resides in memory and/or swap partition(s). Mounting directories as tmpfs can be an effective way of speeding up accesses to their files, or to ensure that their contents are automatically cleared upon reboot. + +## Usage + +**Create a tmpfs**: +`mount -t tmpfs -o [OPTIONS] tmpfs [MOUNT_POINT]` + +**Resize a tmpfs**: +`mount -t tmpfs -o remount,size= tmpfs [MOUNT_POINT]` + +### Options + +| **Option** | **Description** | +| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `size=bytes` | Specify an upper limit on the size of the filesystem. Size is given in bytes, rounded up to entire pages. A `k`, `m`, or `g` suffix can be used for Ki, Mi, or Gi. Use `%` to specify a percentage of physical RAM. Default: 50%. Set to `0` to remove the limit. | +| `nr_blocks=blocks` | Similar to `size`, but in blocks of `PAGE_CACHE_SIZE`. Accepts `k`, `m`, or `g` suffixes, but not `%`. | +| `nr_inodes=inodes` | Sets the maximum number of inodes. Default is half the number of physical RAM pages or the number of lowmem RAM pages (whichever is smaller). Use `k`, `m`, or `g` suffixes, but `%` is not supported. Set to `0` to remove the limit. | +| `noswap` | Disables swap. Remounts must respect the original settings. By default, swap is enabled. | +| `mode=mode` | Sets the initial permissions of the root directory. | +| `gid=gid` | Sets the initial group ID of the root directory. | +| `uid=uid` | Sets the initial user ID of the root directory. | +| `huge=huge_option` | Sets the huge table memory allocation policy for all files (if `CONFIG_TRANSPARENT_HUGEPAGE` is enabled). Options: `never` (default), `always`, `within_size`, `advise`, `deny`, or `force`. | +| `mpol=mpol_option` | Sets NUMA memory allocation policy (if `CONFIG_NUMA` is enabled). Options: `default`, `prefer:node`, `bind:nodelist`, `interleave`, `interleave:nodelist`, or `local`. Example: `mpol=bind:0-3,5,7,9-15`. | From f7374157b35650975a946589bf5f2f3791d696e2 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Tue, 17 Dec 2024 14:25:09 +0100 Subject: [PATCH 19/99] add archiso --- technology/linux/Arch Linux.md | 2 + technology/linux/archiso.md | 426 +++++++++++++++++++++++++++++++++ 2 files changed, 428 insertions(+) create mode 100644 technology/linux/archiso.md diff --git a/technology/linux/Arch Linux.md b/technology/linux/Arch Linux.md index 7898134..d97ad8c 100644 --- a/technology/linux/Arch Linux.md +++ b/technology/linux/Arch Linux.md @@ -12,6 +12,8 @@ Installation of Arch Linux is typically done manually following the [Wiki](https curl -L matmoul.github.io/archfi | bash ``` +You can create a (custom) ISO with [archiso](./archiso.md). + ## Basic Install ```shell # Set keyboard diff --git a/technology/linux/archiso.md b/technology/linux/archiso.md new file mode 100644 index 0000000..baafbe1 --- /dev/null +++ b/technology/linux/archiso.md @@ -0,0 +1,426 @@ +--- +obj: application +arch-wiki: https://wiki.archlinux.org/title/Archiso +repo: https://gitlab.archlinux.org/archlinux/archiso +rev: 2024-12-17 +--- + +# archiso +Archiso is a highly-customizable tool for building Arch Linux live CD/USB ISO images. The official images are built with archiso and include the following packages. It can be used as the basis for rescue systems, linux installers or other systems. This wiki article explains how to install archiso, and how to configure it to control aspects of the resulting ISO image such as included packages and files. Technical requirements and build steps can be found in the official project documentation. Archiso is implemented with a number of bash scripts. The core component of archiso is the mkarchiso command. Its options are documented in mkarchiso -h and not covered here. + +## Prepare a custom profile +Archiso comes with two profiles, `releng` and `baseline`. +- `releng` is used to create the official monthly installation ISO. It can be used as a starting point for creating a customized ISO image. +- `baseline` is a minimal configuration, that includes only the bare minimum packages required to boot the live environment from the medium. + +If you wish to adapt or customize one of archiso's shipped profiles, copy it from `/usr/share/archiso/configs/profile-name/` to a writable directory with a name of your choice. For example: + +```sh +cp -r /usr/share/archiso/configs/releng/ archlive +``` + +## Profile structure +An archiso profile contains configuration that defines the resulting ISO image. The profile structure is documented in `/usr/share/doc/archiso/README.profile.rst`. + +An archiso profile consists of several configuration files and a directory for files to be added to the resulting image. + +``` + profile/ + ├── airootfs/ + ├── efiboot/ + ├── syslinux/ + ├── grub/ + ├── bootstrap_packages.arch + ├── packages.arch + ├── pacman.conf + └── profiledef.sh +``` + +The required files and directories are explained in the following sections. + +### profiledef.sh +This file describes several attributes of the resulting image and is a place for customization to the general behavior of the image. + +The image file is constructed from some of the variables in ``profiledef.sh``: ``--.iso`` +(e.g. ``archlinux-202010-x86_64.iso``). + +* ``iso_name``: The first part of the name of the resulting image (defaults to ``mkarchiso``) +* ``iso_label``: The ISO's volume label (defaults to ``MKARCHISO``) +* ``iso_publisher``: A free-form string that states the publisher of the resulting image (defaults to ``mkarchiso``) +* ``iso_application``: A free-form string that states the application (i.e. its use-case) of the resulting image (defaults + to ``mkarchiso iso``) +* ``iso_version``: A string that states the version of the resulting image (defaults to ``""``) +* ``install_dir``: A string (maximum eight characters long, which **must** consist of ``[a-z0-9]``) that states the + directory on the resulting image into which all files will be installed (defaults to ``mkarchiso``) +* ``buildmodes``: An optional list of strings, that state the build modes that the profile uses. Only the following are + understood: + + - ``bootstrap``: Build a compressed file containing a minimal system to bootstrap from + - ``iso``: Build a bootable ISO image (implicit default, if no ``buildmodes`` are set) + - ``netboot``: Build artifacts required for netboot using iPXE +* ``bootmodes``: A list of strings, that state the supported boot modes of the resulting image. Only the following are + understood: + + - ``bios.syslinux.mbr``: Syslinux for x86 BIOS booting from a disk + - ``bios.syslinux.eltorito``: Syslinux for x86 BIOS booting from an optical disc + - ``uefi-ia32.grub.esp``: GRUB for IA32 UEFI booting from a disk + - ``uefi-ia32.grub.eltorito``: GRUB for IA32 UEFI booting from an optical disc + - ``uefi-x64.grub.esp``: GRUB for x64 UEFI booting from a disk + - ``uefi-x64.grub.eltorito``: GRUB for x64 UEFI booting from an optical disc + - ``uefi-ia32.systemd-boot.esp``: systemd-boot for IA32 UEFI booting from a disk + - ``uefi-ia32.systemd-boot.eltorito``: systemd-boot for IA32UEFI booting from an optical disc + - ``uefi-x64.systemd-boot.esp``: systemd-boot for x64 UEFI booting from a disk + - ``uefi-x64.systemd-boot.eltorito``: systemd-boot for x64 UEFI booting from an optical disc + Note that BIOS El Torito boot mode must always be listed before UEFI El Torito boot mode. +* ``arch``: The architecture (e.g. ``x86_64``) to build the image for. This is also used to resolve the name of the packages + file (e.g. ``packages.x86_64``) +* ``pacman_conf``: The ``pacman.conf`` to use to install packages to the work directory when creating the image (defaults to + the host's ``/etc/pacman.conf``) +* ``airootfs_image_type``: The image type to create. The following options are understood (defaults to ``squashfs``): + + - ``squashfs``: Create a squashfs image directly from the airootfs work directory + - ``ext4+squashfs``: Create an ext4 partition, copy the airootfs work directory to it and create a squashfs image from it + - ``erofs``: Create an EROFS image for the airootfs work directory +* ``airootfs_image_tool_options``: An array of options to pass to the tool to create the airootfs image. ``mksquashfs`` and + ``mkfs.erofs`` are supported. See ``mksquashfs --help`` or ``mkfs.erofs --help`` for all possible options +* ``bootstrap_tarball_compression``: An array containing the compression program and arguments passed to it for + compressing the bootstrap tarball (defaults to ``cat``). For example: ``bootstrap_tarball_compression=(zstd -c -T0 --long -19)``. +* ``file_permissions``: An associative array that lists files and/or directories who need specific ownership or + permissions. The array's keys contain the path and the value is a colon separated list of owner UID, owner GID and + access mode. E.g. ``file_permissions=(["/etc/shadow"]="0:0:400")``. When directories are listed with a trailing backslash (``/``) **all** files and directories contained within the listed directory will have the same owner UID, owner GID, and access mode applied recursively. + +### bootstrap_packages.arch +All packages to be installed into the environment of a bootstrap image have to be listed in an architecture specific file (e.g. ``bootstrap_packages.x86_64``), which resides top-level in the profile. + +Packages have to be listed one per line. Lines starting with a ``#`` and blank lines are ignored. + +This file is required when generating bootstrap images using the ``bootstrap`` build mode. + +### packages.arch +All packages to be installed into the environment of an ISO image have to be listed in an architecture specific file (e.g. ``packages.x86_64``), which resides top-level in the profile. + +Packages have to be listed one per line. Lines starting with a ``#`` and blank lines are ignored. + +This file is required when generating ISO images using the ``iso`` or ``netboot`` build modes. + +### pacman.conf +A configuration for pacman is required per profile. + +Some configuration options will not be used or will be modified: + +* ``CacheDir``: the profile's option is **only** used if it is not the default (i.e. ``/var/cache/pacman/pkg``) and if it is + not the same as the system's option. In all other cases the system's pacman cache is used. +* ``HookDir``: it is **always** set to the ``/etc/pacman.d/hooks`` directory in the work directory's airootfs to allow + modification via the profile and ensure interoparability with hosts using dracut +* ``RootDir``: it is **always** removed, as setting it explicitely otherwise refers to the host's root filesystem (see + ``man 8 pacman`` for further information on the ``-r`` option used by ``pacstrap``) +* ``LogFile``: it is **always** removed, as setting it explicitely otherwise refers to the host's pacman log file (see + ``man 8 pacman`` for further information on the ``-r`` option used by ``pacstrap``) +* ``DBPath``: it is **always** removed, as setting it explicitely otherwise refers to the host's pacman database (see + ``man 8 pacman`` for further information on the ``-r`` option used by ``pacstrap``) + +### airootfs +This optional directory may contain files and directories that will be copied to the work directory of the resulting image's root filesystem. +The files are copied before packages are being installed to work directory location. +Ownership and permissions of files and directories from the profile's ``airootfs`` directory are not preserved. The mode will be ``644`` for files and ``755`` for directories, all of them will be owned by root. To set custom ownership and/or permissions, use ``file_permissions`` in ``profiledef.sh``. + +With this overlay structure it is possible to e.g. create users and set passwords for them, by providing ``airootfs/etc/passwd``, ``airootfs/etc/shadow``, ``airootfs/etc/gshadow`` (see ``man 5 passwd``, ``man 5 shadow`` and ``man 5 gshadow`` respectively). +If user home directories exist in the profile's ``airootfs``, their ownership and (and top-level) permissions will be altered according to the provided information in the password file. + +### Boot loader configuration +A profile may contain configuration for several boot loaders. These reside in specific top-level directories, which are explained in the following subsections. + +The following *custom template identifiers* are understood and will be replaced according to the assignments of the respective variables in ``profiledef.sh``: + +* ``%ARCHISO_LABEL%``: Set this using the ``iso_label`` variable in ``profiledef.sh``. +* ``%INSTALL_DIR%``: Set this using the ``install_dir`` variable in ``profiledef.sh``. +* ``%ARCH%``: Set this using the ``arch`` variable in ``profiledef.sh``. + +Additionally there are also *custom template identifiers* have harcoded values set by ``mkarchiso`` that cannot be overridden: + +* ``%ARCHISO_UUID%``: the ISO 9660 modification date in UTC, i.e. its "UUID", +* ``%ARCHISO_SEARCH_FILENAME%``: file path on ISO 9660 that can be used by GRUB to find the ISO volume + (**for GRUB ``.cfg`` files only**). + +### efiboot +This directory is mandatory when the ``uefi-x64.systemd-boot.esp`` or ``uefi-x64.systemd-boot.eltorito`` bootmodes are selected in ``profiledef.sh``. It contains configuration for `systemd-boot`. + +> **Note:** The directory is a top-level representation of the systemd-boot configuration directories and files found in the root of an EFI system partition. + +The *custom template identifiers* are **only** understood in the boot loader entry `.conf` files (i.e. **not** in ``loader.conf``). + +### syslinux +This directory is mandatory when the ``bios.syslinux.mbr`` or the ``bios.syslinux.eltorito`` bootmodes are selected in ``profiledef.sh``. +It contains configuration files for `syslinux` or `isolinux` , or `pxelinux` used in the resulting image. + +The *custom template identifiers* are understood in all `.cfg` files in this directory. + +### grub +This directory is mandatory when any of the following bootmodes is used in ``profiledef.sh``: + +- ``uefi-ia32.grub.esp`` or +- ``uefi-ia32.grub.eltorito`` or +- ``uefi-x64.grub.esp`` or +- ``uefi-x64.grub.eltorito`` + +It contains configuration files for `GRUB` used in the resulting image. + +## Customization +### Selecting packages +Edit `packages.x86_64` to select which packages are to be installed on the live system image, listing packages line by line. + +### Custom local repository +To add packages not located in standard Arch repositories (e.g. packages from the AUR or customized with the ABS), set up a custom local repository and add your custom packages to it. Then add your repository to `pacman.conf` as follows: + +```ini +[customrepo] +SigLevel = Optional TrustAll +Server = file:///path/to/customrepo +``` + +> **Note**: The ordering within `pacman.conf` matters. To give top priority to your custom repository, place it above the other repository entries. +> This `pacman.conf` is only used for building the image. It will not be used in the live environment. +> Ensure that the repository is located in a directory accessible by the chrooted mkarchiso process, such as `/tmp`, to ensure the repository is read correctly during the image building process. + +### Packages from multilib +To install packages from the multilib repository, simply uncomment that repository in `pacman.conf`. + +### Adding files to image +The `airootfs` directory is used as the starting point for the root directory (`/`) of the live system on the image. All its contents will be copied over to the working directory before packages are installed. + +Place any custom files and/or directories in the desired location under `airootfs/`. For example, if you have a set of iptables scripts on your current system you want to be used on your live image, copy them over as such: + +```sh +cp -r /etc/iptables archlive/airootfs/etc +``` + +Similarly, some care is required for special configuration files that reside somewhere down the hierarchy. Missing parts of the directory structure can be simply created with `mkdir`. +Tip: To add a file to the install user's home directory, place it in `archlive/airootfs/root/`. To add a file to all other users home directories, place it in `archlive/airootfs/etc/skel/`. + +> **Note**: Custom files that conflict with those provided by packages will be overwritten unless a package specifies them as backup files. + +By default, permissions will be 644 for files and 755 for directories. All of them will be owned by the root user. To set different permissions or ownership for specific files and/or folders, use the `file_permissions` associative array in `profiledef.sh`. + +### Adding repositories to the image +To add a repository that can be used in the live environment, create a suitably modified `pacman.conf` and place it in `archlive/airootfs/etc/`. + +If the repository also uses a key, place the key in `archlive/airootfs/usr/share/pacman/keyrings/`. The key file name must end with `.gpg`. Additionally, the key must be trusted. This can be accomplished by creating a GnuPG exported trust file in the same directory. The file name must end with `-trusted`. The first field is the key fingerprint, and the second is the trust. You can reference `/usr/share/pacman/keyrings/archlinux-trusted` for an example. + +#### archzfs example +The files in this example are: + +``` +airootfs +├── etc +│ ├── pacman.conf +│ └── pacman.d +│ └── archzfs_mirrorlist +└── usr + └── share + └── pacman + └── keyrings + ├── archzfs.gpg + └── archzfs-trusted +``` + +`airootfs/etc/pacman.conf`: + +```ini +[archzfs] +Include = /etc/pacman.d/archzfs_mirrorlist +``` + +`airootfs/etc/pacman.d/archzfs_mirrorlist`: + +``` +Server = https://archzfs.com/$repo/$arch +Server = https://mirror.sum7.eu/archlinux/archzfs/$repo/$arch +Server = https://mirror.biocrafting.net/archlinux/archzfs/$repo/$arch +Server = https://mirror.in.themindsmaze.com/archzfs/$repo/$arch +Server = https://zxcvfdsa.com/archzfs/$repo/$arch +``` + +`airootfs/usr/share/pacman/keyrings/archzfs-trusted`: + +``` +DDF7DB817396A49B2A2723F7403BD972F75D9D76:4: +``` + +`archzfs.gpg` itself can be obtained directly from the repository site at https://archzfs.com/archzfs.gpg. + +### Kernel +Although both archiso's included profiles only have linux, ISOs can be made to include other or even multiple kernels. + +First, edit `packages.x86_64` to include kernel package names that you want. When mkarchiso runs, it will include all `work_dir/airootfs/boot/vmlinuz-*` and `work_dir/boot/initramfs-*.img` files in the ISO (and additionally in the FAT image used for UEFI booting). + +mkinitcpio presets by default will build fallback initramfs images. For an ISO, the main initramfs image would not typically include the autodetect hook, thus making an additional fallback image unnecessary. To prevent the creation of an fallback initramfs image, so that it does not take up space or slow down the build process, place a custom preset in `archlive/airootfs/etc/mkinitcpio.d/pkgbase.preset`. For example, for linux-lts: + +`archlive/airootfs/etc/mkinitcpio.d/linux-lts.preset`: + +``` +PRESETS=('archiso') + +ALL_kver='/boot/vmlinuz-linux-lts' +ALL_config='/etc/mkinitcpio.conf' + +archiso_image="/boot/initramfs-linux-lts.img" +``` + +Finally create boot loader configuration to allow booting the kernel(s). + +### Boot loader +Archiso supports syslinux for BIOS booting and GRUB or systemd-boot for UEFI booting. Refer to the articles of the boot loaders for information on their configuration syntax. + +mkarchiso expects that GRUB configuration is in the `grub` directory, systemd-boot configuration is in the `efiboot` directory and syslinux configuration in the `syslinux` directory. + +### UEFI Secure Boot +If you want to make your archiso bootable on a UEFI Secure Boot enabled environment, you must use a signed boot loader. + +### systemd units +To enable systemd services/sockets/timers for the live environment, you need to manually create the symbolic links just as `systemctl enable` does it. + +For example, to enable `gpm.service`, which contains `WantedBy=multi-user.target`, run: + +```sh +mkdir -p archlive/airootfs/etc/systemd/system/multi-user.target.wants +ln -s /usr/lib/systemd/system/gpm.service archlive/airootfs/etc/systemd/system/multi-user.target.wants/ +``` + +The required symlinks can be found out by reading the systemd unit, or if you have the service installed, by enabling it and observing the systemctl output. + +### Login manager +Starting X at boot is done by enabling your login manager's systemd service. If you do not know which `.service` to enable, you can easily find out in case you are using the same program on the system you build your ISO on. Just use: + +```sh +ls -l /etc/systemd/system/display-manager.service +``` + +Now create the same symlink in `archlive/airootfs/etc/systemd/system/`. + +### Changing automatic login +The configuration for getty's automatic login is located under `airootfs/etc/systemd/system/getty@tty1.service.d/autologin.conf`. + +You can modify this file to change the auto login user: + +```ini +[Service] +ExecStart= +ExecStart=-/sbin/agetty --autologin username --noclear %I 38400 linux +``` + +Or remove `autologin.conf` altogether to disable auto login. + +If you are using the serial console, create `airootfs/etc/systemd/system/serial-getty@ttyS0.service.d/autologin.conf` with the following content instead: + +```ini +[Service] +ExecStart= +ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear --autologin root --keep-baud 115200,57600,38400,9600 - $TERM +``` + +### Users and passwords +To create a user which will be available in the live environment, you must manually edit `archlive/airootfs/etc/passwd`, `archlive/airootfs/etc/shadow`, `archlive/airootfs/etc/group` and `archlive/airootfs/etc/gshadow`. + +> **Note**: If these files exist, they must contain the root user and group. + +For example, to add a user `archie`. Add them to `archlive/airootfs/etc/passwd` following the passwd syntax: + +``` +root:x:0:0:root:/root:/usr/bin/zsh +archie:x:1000:1000::/home/archie:/usr/bin/zsh +``` + +> **Note**: The passwd file must end with a newline. + +Add the user to `archlive/airootfs/etc/shadow` following the syntax of shadow. If you want to define a password for the user, generate a password hash with `openssl passwd -6` and add it to the file. For example: + +``` +root::14871:::::: +archie:$6$randomsalt$cij4/pJREFQV/NgAgh9YyBIoCRRNq2jp5l8lbnE5aLggJnzIRmNVlogAg8N6hEEecLwXHtMQIl2NX2HlDqhCU1:14871:::::: +``` + +Otherwise, you may keep the password field empty, meaning that the user can log in with no password. + +Add the user's group and the groups which they will part of to `archlive/airootfs/etc/group` according to group syntax. For example: + +``` +root:x:0:root +adm:x:4:archie +wheel:x:10:archie +uucp:x:14:archie +archie:x:1000: +``` + +Create the appropriate `archlive/airootfs/etc/gshadow` according to gshadow: + +``` +root:!*::root +archie:!*:: +``` + +Make sure `/etc/shadow` and `/etc/gshadow` have the correct permissions: + +`archlive/profiledef.sh`: + +``` +file_permissions=( + ... + ["/etc/shadow"]="0:0:0400" + ["/etc/gshadow"]="0:0:0400" +) +``` + +After package installation, mkarchiso will create all specified home directories for users listed in `archlive/airootfs/etc/passwd` and copy `work_directory/x86_64/airootfs/etc/skel/*` to them. The copied files will have proper user and group ownership. + +### Changing the distribution name used in the ISO +Start by copying the file `/etc/os-release` into the `etc/` folder in the rootfs. Then, edit the file accordingly. You can also change the name inside of GRUB and syslinux. + +### Adjusting the size of the root file system +When installing packages in the live environment, for example on hardware requiring DKMS modules, the default size of the root file system might not allow the download and installation of such packages due to its size. + +To adjust the size on the fly: + +```sh +mount -o remount,size=SIZE /run/archiso/cowspace +``` + +To adjust the size at the bootloader stage (as a kernel cmdline by pressing `e` or `Tab`) use the boot option: + +```sh +cow_spacesize=SIZE +``` + +To adjust the size while building an image add the boot option to: +- `efiboot/loader/entries/*.cfg` +- `grub/*.cfg` +- `syslinux/*.cfg` + +## Build the ISO +Build an ISO which you can then burn to CD or USB by running: + +```sh +mkarchiso -v -w /path/to/work_dir -o /path/to/out_dir /path/to/profile/ +``` + +Replace `/path/to/profile/` with the path to your custom profile, or with `/usr/share/archiso/configs/releng/` if you are building an unmodified profile. + +When run, the script will download and install the packages you specified to `work_directory/x86_64/airootfs`, create the kernel and init images, apply your customizations and finally build the ISO into the output directory. + +> **Tip**: If memory allows, it is preferred to place the working directory on `tmpfs`. + +```sh +mkdir ./work +mount -t tmpfs -o size=1G tmpfs ./work +mkarchiso -v -w ./work -o /path/to/out_dir /path/to/profile/ +umount -r ./work +``` + +### Removal of work directory + +> **Warning**: If mkarchiso is interrupted, run `findmnt` to make sure there are no mount binds before deleting it - otherwise, you may lose data (e.g. an external device mounted at `/run/media/user/label` gets bound within `work/x86_64/airootfs/run/media/user/label` during the build process). + +The temporary files are copied into work directory. After successfully building the ISO , the work directory and its contents can be deleted. E.g.: + +```sh +rm -rf /path/to/work_dir +``` From 40e711e9d06ed4796da5d610cea9254594e1035f Mon Sep 17 00:00:00 2001 From: JMARyA Date: Wed, 18 Dec 2024 15:49:31 +0100 Subject: [PATCH 20/99] update sddm --- technology/applications/desktops/SDDM.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/technology/applications/desktops/SDDM.md b/technology/applications/desktops/SDDM.md index aeb1cd4..1625666 100644 --- a/technology/applications/desktops/SDDM.md +++ b/technology/applications/desktops/SDDM.md @@ -3,7 +3,7 @@ obj: application arch-wiki: https://wiki.archlinux.org/title/SDDM wiki: https://en.wikipedia.org/wiki/Simple_Desktop_Display_Manager repo: https://github.com/sddm/sddm -rev: 2024-12-17 +rev: 2024-12-18 --- # SDDM @@ -69,3 +69,12 @@ This should open a new window for every monitor you have connected and show a pr To set the mouse cursor theme, set `CursorTheme` to your preferred cursor theme. Valid Plasma mouse cursor theme names are `breeze_cursors`, `Breeze_Snow` and `breeze-dark`. + +### Keyboard Layout +To set the keyboard layout with SDDM, edit ` /usr/share/sddm/scripts/Xsetup`: + +``` +#!/bin/sh +# Xsetup - run as root before the login dialog appears +setxkbmap de,us +``` From f1ac09f57f9413fbae37d48b7bcb6a09f880fbe5 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Fri, 20 Dec 2024 08:09:59 +0100 Subject: [PATCH 21/99] update rsync --- technology/applications/cli/rsync.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/technology/applications/cli/rsync.md b/technology/applications/cli/rsync.md index 35e7656..6393295 100644 --- a/technology/applications/cli/rsync.md +++ b/technology/applications/cli/rsync.md @@ -1,6 +1,7 @@ --- obj: application -website: https://rsync.samba.org/ +website: https://rsync.samba.org +arch-wiki: https://wiki.archlinux.org/title/Rsync repo: https://github.com/WayneD/rsync --- @@ -44,4 +45,3 @@ Either `source` or `destination` can be a local folder or a remote path (`user@h | --log-file=FILE | log what we're doing to the specified FILE | | --partial | keep partially transferred files | | -P | same as --partial --progress | - From ad237ca6d2bf3e6749f5bbcbd511c7eaa7819d03 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Fri, 20 Dec 2024 08:42:03 +0100 Subject: [PATCH 22/99] update arch pkg --- .../package managers/arch-linux/PKGBUILD.md | 192 ++++++++- .../package managers/arch-linux/Pacman.md | 364 +++++++++++++++++- .../package managers/arch-linux/makepkg.md | 295 +++++++++++++- 3 files changed, 827 insertions(+), 24 deletions(-) diff --git a/technology/applications/package managers/arch-linux/PKGBUILD.md b/technology/applications/package managers/arch-linux/PKGBUILD.md index e696095..a845d7c 100644 --- a/technology/applications/package managers/arch-linux/PKGBUILD.md +++ b/technology/applications/package managers/arch-linux/PKGBUILD.md @@ -1,17 +1,18 @@ --- arch-wiki: https://wiki.archlinux.org/title/PKGBUILD obj: concept +rev: 2024-12-19 --- # PKGBUILD A `PKGBUILD` is a shell script containing the build information required by [Arch Linux](../../../linux/Arch%20Linux.md) packages. [Arch Wiki](https://wiki.archlinux.org/title/PKGBUILD) -Packages in [Arch Linux](../../../linux/Arch%20Linux.md) are built using the [makepkg](makepkg.md) utility. When [makepkg](makepkg.md) is run, it searches for a PKGBUILD file in the current directory and follows the instructions therein to either compile or otherwise acquire the files to build a package archive (pkgname.pkg.tar.zst). The resulting package contains binary files and installation instructions, readily installable with [pacman](Pacman.md). +Packages in [Arch Linux](../../../linux/Arch%20Linux.md) are built using the [makepkg](makepkg.md) utility. When [makepkg](makepkg.md) is run, it searches for a `PKGBUILD` file in the current directory and follows the instructions therein to either compile or otherwise acquire the files to build a package archive (`pkgname.pkg.tar.zst`). The resulting package contains binary files and installation instructions, readily installable with [pacman](Pacman.md). -Mandatory variables are `pkgname`, `pkgver`, `pkgrel`, and `arch`. `license` is not strictly necessary to build a package, but is recommended for any PKGBUILD shared with others, as [makepkg](makepkg.md) will produce a warning if not present. +Mandatory variables are `pkgname`, `pkgver`, `pkgrel`, and `arch`. `license` is not strictly necessary to build a package, but is recommended for any `PKGBUILD` shared with others, as [makepkg](makepkg.md) will produce a warning if not present. -# Example +## Example PKGBUILD: ```sh # Maintainer: User @@ -48,4 +49,187 @@ package() { cd "$pkgname" install -Dm755 ./app "$pkgdir/usr/bin/app" } -``` \ No newline at end of file +``` + +## Directives +The following is a list of standard options and directives available for use in a `PKGBUILD`. These are all understood and interpreted by `makepkg`, and most of them will be directly transferred to the built package. + +If you need to create any custom variables for use in your build process, it is recommended to prefix their name with an `_` (underscore). This will prevent any possible name clashes with internal `makepkg` variables. For example, to store the base kernel version in a variable, use something similar to `$_basekernver`. + +### Name and Version + +#### `pkgname` +Either the name of the package or an array of names for split packages. +Valid characters for members of this array are alphanumerics, and any of the following characters: `@ . _ + -`. Additionally, names are not allowed to start with hyphens or dots. + +#### `pkgver` +The version of the software as released from the author (e.g., `2.7.1`). The variable is not allowed to contain colons, forward slashes, hyphens or whitespace. + +The pkgver variable can be automatically updated by providing a `pkgver()` function in the `PKGBUILD` that outputs the new package version. This is run after downloading and extracting the sources and running the `prepare()` function (if present), so it can use those files in determining the new `pkgver`. This is most useful when used with sources from version control systems. + +#### `pkgrel` +This is the release number specific to the distribution. This allows package maintainers to make updates to the package’s configure flags, for example. This is typically set to `1` for each new upstream software release and incremented for intermediate `PKGBUILD` updates. The variable is a positive integer, with an optional subrelease level specified by adding another positive integer separated by a period (i.e. in the form `x.y`). + +#### `epoch` +Used to force the package to be seen as newer than any previous versions with a lower epoch, even if the version number would normally not trigger such an upgrade. This value is required to be a positive integer; the default value if left unspecified is 0. This is useful when the version numbering scheme of a package changes (or is alphanumeric), breaking normal version comparison logic. + +### Generic + +#### `pkgdesc` +This should be a brief description of the package and its functionality. Try to keep the description to one line of text and to not use the package’s name. + +#### `url` +This field contains a URL that is associated with the software being packaged. This is typically the project’s web site. + +#### `license` (array) +This field specifies the license(s) that apply to the package. If multiple licenses are applicable, list all of them: `license=('GPL' 'FDL')`. + +#### `arch` (array) +Defines on which architectures the given package is available (e.g., `arch=('i686' 'x86_64')`). Packages that contain no architecture specific files should use `arch=('any')`. Valid characters for members of this array are alphanumerics and `_`. + +#### `groups` (array) +An array of symbolic names that represent groups of packages, allowing you to install multiple packages by requesting a single target. For example, one could install all KDE packages by installing the kde group. + +### Dependencies + +#### `depends` (array) +An array of packages this package depends on to run. Entries in this list should be surrounded with single quotes and contain at least the package name. Entries can also include a version requirement of the form `name<>version`, where `<>` is one of five comparisons: `>=` (greater than or equal to), `<=` (less than or equal to), `=` (equal to), `>` (greater than), or `<` (less than). + +If the dependency name appears to be a library (ends with `.so`), `makepkg` will try to find a binary that depends on the library in the built package and append the version needed by the binary. Appending the version yourself disables automatic detection. + +Additional architecture-specific depends can be added by appending an underscore and the architecture name e.g., `depends_x86_64=()`. + +#### `makedepends` (array) +An array of packages this package depends on to build but are not needed at runtime. Packages in this list follow the same format as `depends`. + +Additional architecture-specific `makedepends` can be added by appending an underscore and the architecture name e.g., `makedepends_x86_64=()`. + +#### `checkdepends` (array) +An array of packages this package depends on to run its test suite but are not needed at runtime. Packages in this list follow the same format as depends. These dependencies are only considered when the `check()` function is present and is to be run by `makepkg`. + +Additional architecture-specific checkdepends can be added by appending an underscore and the architecture name e.g., `checkdepends_x86_64=()` + +#### `optdepends` (array) +An array of packages (and accompanying reasons) that are not essential for base functionality, but may be necessary to make full use of the contents of this package. optdepends are currently for informational purposes only and are not utilized by pacman during dependency resolution. Packages in this list follow the same format as depends, with an optional description appended. The format for specifying optdepends descriptions is: + +```shell +optdepends=('python: for library bindings') +``` + +Additional architecture-specific optdepends can be added by appending an underscore and the architecture name e.g., `optdepends_x86_64=()`. + +### Package Relations + +#### `provides` (array) +An array of “virtual provisions” this package provides. This allows a package to provide dependencies other than its own package name. For example, the `dcron` package can provide `cron`, which allows packages to depend on `cron` rather than `dcron` OR `fcron`. + +Versioned provisions are also possible, in the `name=version` format. For example, `dcron` can provide `cron=2.0` to satisfy the `cron>=2.0` dependency of other packages. Provisions involving the `>` and `<` operators are invalid as only specific versions of a package may be provided. + +If the provision name appears to be a library (ends with `.so`), makepkg will try to find the library in the built package and append the correct version. Appending the version yourself disables automatic detection. + +Additional architecture-specific provides can be added by appending an underscore and the architecture name e.g., `provides_x86_64=()`. + +#### `conflicts` (array) +An array of packages that will conflict with this package (i.e. they cannot both be installed at the same time). This directive follows the same format as `depends`. Versioned conflicts are supported using the operators as described in `depends`. + +Additional architecture-specific conflicts can be added by appending an underscore and the architecture name e.g., `conflicts_x86_64=()`. + +#### `replaces` (array) +An array of packages this package should replace. This can be used to handle renamed/combined packages. For example, if the `j2re` package is renamed to `jre`, this directive allows future upgrades to continue as expected even though the package has moved. Versioned replaces are supported using the operators as described in `depends`. + +Sysupgrade is currently the only pacman operation that utilizes this field. A normal sync or upgrade will not use its value. + +Additional architecture-specific replaces can be added by appending an underscore and the architecture name e.g., `replaces_x86_64=()`. + +### Other + +#### `backup` (array) +An array of file names, without preceding slashes, that should be backed up if the package is removed or upgraded. This is commonly used for packages placing configuration files in `/etc`. + +#### `options` (array) +This array allows you to override some of makepkg’s default behavior when building packages. To set an option, just include the option name in the `options` array. To reverse the default behavior, place an `!` at the front of the option. Only specify the options you specifically want to override, the rest will be taken from `makepkg.conf` + +| Option | Description | +| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `strip` | Strip symbols from binaries and libraries. If you frequently use a debugger on programs or libraries, it may be helpful to disable this option. | +| `docs` | Save doc directories. If you wish to delete doc directories, specify `!docs` in the array. | +| `libtool` | Leave libtool (`.la`) files in packages. Specify `!libtool` to remove them. | +| `staticlibs` | Leave static library (`.a`) files in packages. Specify `!staticlibs` to remove them (if they have a shared counterpart). | +| `emptydirs` | Leave empty directories in packages. | +| `zipman` | Compress man and info pages with gzip. | +| `ccache` | Allow the use of ccache during `build()`. More useful in its negative form `!ccache` with select packages that have problems building with ccache. | +| `distcc` | Allow the use of distcc during `build()`. More useful in its negative form `!distcc` with select packages that have problems building with distcc. | +| `buildflags` | Allow the use of user-specific buildflags (`CPPFLAGS`, `CFLAGS`, `CXXFLAGS`, `LDFLAGS`) during `build()` as specified in `makepkg.conf`. More useful in its negative form `!buildflags` with select packages that have problems building with custom buildflags. | +| `makeflags` | Allow the use of user-specific makeflags during `build()` as specified in `makepkg.conf`. More useful in its negative form `!makeflags` with select packages that have problems building with custom makeflags such as `-j2`. | +| `debug` | Add the user-specified debug flags (`DEBUG_CFLAGS`, `DEBUG_CXXFLAGS`) to their counterpart buildflags as specified in `makepkg.conf`. When used in combination with the `strip` option, a separate package containing the debug symbols is created. | +| `lto` | Enable building packages using link time optimization. Adds `-flto` to both `CFLAGS` and `CXXFLAGS`. | + +#### `install` +Specifies a special install script that is to be included in the package. This file should reside in the same directory as the `PKGBUILD` and will be copied into the package by `makepkg`. It does not need to be included in the source array (e.g., `install=$pkgname.install`). + +Pacman has the ability to store and execute a package-specific script when it installs, removes, or upgrades a package. This allows a package to configure itself after installation and perform an opposite action upon removal. + +The exact time the script is run varies with each operation, and should be self-explanatory. Note that during an upgrade operation, none of the install or remove functions will be called. + +Scripts are passed either one or two “full version strings”, where a full version string is either `pkgver-pkgrel` or `epoch:pkgver-pkgrel`, if `epoch` is non-zero. + +- `pre_install`: Run right before files are extracted. One argument is passed: new package full version string. +- `post_install`: Run right after files are extracted. One argument is passed: new package full version string. +- `pre_upgrade`: Run right before files are extracted. Two arguments are passed in this order: new package full version string, old package full version string. +- `post_upgrade`: Run after files are extracted. Two arguments are passed in this order: new package full version string, old package full version string. +- `pre_remove`: Run right before files are removed. One argument is passed: old package full version string. +- `post_remove`: Run right after files are removed. One argument is passed: old package full version string. + +To use this feature, create a file such as `pkgname.install` and put it in the same directory as the `PKGBUILD` script. Then use the install directive: `install=pkgname.install` + +#### `changelog` +Specifies a changelog file that is to be included in the package. The changelog file should end in a single newline. This file should reside in the same directory as the `PKGBUILD` and will be copied into the package by `makepkg`. It does not need to be included in the source array (e.g., `changelog=$pkgname.changelog`). + +### Sources + +#### `source` (array) +An array of source files required to build the package. Source files must either reside in the same directory as the `PKGBUILD`, or be a fully-qualified URL that `makepkg` can use to download the file. To simplify the maintenance of `PKGBUILDs`, use the `$pkgname` and `$pkgver` variables when specifying the download location, if possible. Compressed files will be extracted automatically unless found in the `noextract` array described below. + +Additional architecture-specific sources can be added by appending an underscore and the architecture name e.g., `source_x86_64=()`. There must be a corresponding integrity array with checksums, e.g. `cksums_x86_64=()`. + +It is also possible to change the name of the downloaded file, which is helpful with weird URLs and for handling multiple source files with the same name. The syntax is: `source=('filename::url')`. + +Files in the source array with extensions `.sig`, `.sign` or, `.asc` are recognized by makepkg as PGP signatures and will be automatically used to verify the integrity of the corresponding source file. + +#### `noextract` (array) +An array of file names corresponding to those from the source array. Files listed here will not be extracted with the rest of the source files. This is useful for packages that use compressed data directly. + +#### `validpgpkeys` (array) +An array of PGP fingerprints. If this array is non-empty, `makepkg` will only accept signatures from the keys listed here and will ignore the trust values from the keyring. If the source file was signed with a subkey, `makepkg` will still use the primary key for comparison. + +Only full fingerprints are accepted. They must be uppercase and must not contain whitespace characters. + +### Integrity + +#### `cksums` (array) +This array contains CRC checksums for every source file specified in the source array (in the same order). `makepkg` will use this to verify source file integrity during subsequent builds. If `SKIP` is put in the array in place of a normal hash, the integrity check for that source file will be skipped. To easily generate cksums, run `makepkg -g >> PKGBUILD`. If desired, move the cksums line to an appropriate location. Note that checksums generated by `makepkg -g` should be verified using checksum values provided by the software developer. + +#### `md5sums`, `sha1sums`, `sha224sums`, `sha256sums`, `sha384sums`, `sha512sums`, `b2sums` (arrays) +Alternative integrity checks that `makepkg` supports; these all behave similar to the cksums option described above. To enable use and generation of these checksums, be sure to set up the `INTEGRITY_CHECK` option in `makepkg.conf`. + +## Packaging Functions +In addition to the above directives, `PKGBUILDs` require a set of functions that provide instructions to build and install the package. As a minimum, the `PKGBUILD` must contain a `package()` function which installs all the package’s files into the packaging directory, with optional `prepare()`, `build()`, and `check()` functions being used to create those files from source. + +This is directly sourced and executed by `makepkg`, so anything that Bash or the system has available is available for use here. Be sure any exotic commands used are covered by the `makedepends` array. + +If you create any variables of your own in any of these functions, it is recommended to use the Bash `local` keyword to scope the variable to inside the function. + +### `package()` Function +The `package()` function is used to install files into the directory that will become the root directory of the built package and is run after all the optional functions listed below. The packaging stage is run using `fakeroot` to ensure correct file permissions in the resulting package. All other functions will be run as the user calling `makepkg`. This function is run inside `$srcdir`. + +### `verify()` Function +An optional `verify()` function can be specified to implement arbitrary source authentication. The function should return a non-zero exit code when verification fails. This function is run before sources are extracted. This function is run inside `$startdir`. + +### `prepare()` Function +An optional `prepare()` function can be specified in which operations to prepare the sources for building, such as patching, are performed. This function is run after the source extraction and before the `build()` function. The `prepare()` function is skipped when source extraction is skipped. This function is run inside `$srcdir`. + +### `build()` Function +The optional `build()` function is used to compile and/or adjust the source files in preparation to be installed by the `package()` function. This function is run inside `$srcdir`. + +### `check()` Function +An optional `check()` function can be specified in which a package’s test-suite may be run. This function is run between the `build()` and `package()` functions. Be sure any exotic commands used are covered by the `checkdepends` array. This function is run inside `$srcdir`. diff --git a/technology/applications/package managers/arch-linux/Pacman.md b/technology/applications/package managers/arch-linux/Pacman.md index f7ffebe..f6d8985 100644 --- a/technology/applications/package managers/arch-linux/Pacman.md +++ b/technology/applications/package managers/arch-linux/Pacman.md @@ -1,6 +1,9 @@ --- obj: application +arch-wiki: https://wiki.archlinux.org/title/Pacman +rev: 2024-12-19 --- + # Pacman Pacman is the default [Arch Linux](../../../linux/Arch%20Linux.md) Package Manager @@ -56,6 +59,363 @@ pacman -Q ``` Empty the entire pacman cache: -```shell +```shel pacman -Scc -``` \ No newline at end of file +``` + +Read changelog of package: +```shell +pacman -Qc pkgname +``` + +### File Conflicts +When pacman removes a package that has a configuration file, it normally creates a backup copy of that configuration file and appends `.pacsave` to the name of the file. Likewise, when pacman upgrades a package which includes a new configuration file created by the maintainer differing from the currently installed file, it saves a `.pacnew` file with the new configuration. pacman provides notice when these files are written. + +## Configuration +Pacman, using libalpm, will attempt to read `pacman.conf` each time it is invoked. This configuration file is divided into sections or repositories. Each section defines a package repository that pacman can use when searching for packages in `--sync` mode. The exception to this is the `[options]` section, which defines global options. + +```ini +# /etc/pacman.conf + +[options] +# Set the default root directory for pacman to install to. +# This option is used if you want to install a package on a temporary mounted partition which is "owned" by another system, or for a chroot install. +# NOTE: If database path or log file are not specified on either the command line or in pacman.conf(5), their default location will be inside this root path. +RootDir = /path/to/root/dir + +# Overrides the default location of the toplevel database directory. +# The default is /var/lib/pacman/. +# Most users will not need to set this option. +# NOTE: if specified, this is an absolute path and the root path is not automatically prepended. +DBPath = /path/to/db/dir + +# Overrides the default location of the package cache directory. +# The default is /var/cache/pacman/pkg/. +# Multiple cache directories can be specified, and they are tried in the order they are listed in the config file. +# If a file is not found in any cache directory, it will be downloaded to the first cache directory with write access. +# NOTE: this is an absolute path, the root path is not automatically prepended. +CacheDir = /path/to/cache/dir + +# Add directories to search for alpm hooks in addition to the system hook directory (/usr/share/libalpm/hooks/). +# The default is /etc/pacman.d/hooks. +# Multiple directories can be specified with hooks in later directories taking precedence over hooks in earlier directories. +# NOTE: this is an absolute path, the root path is not automatically prepended. For more information on the alpm hooks, see alpm-hooks(5). +HookDir = /path/to/hook/dir + +# Overrides the default location of the directory containing configuration files for GnuPG. +# The default is /etc/pacman.d/gnupg/. +# This directory should contain two files: pubring.gpg and trustdb.gpg. +# pubring.gpg holds the public keys of all packagers. trustdb.gpg contains a so-called trust database, which specifies that the keys are authentic and trusted. +# NOTE: this is an absolute path, the root path is not automatically prepended. +GPGDir = /path/to/gpg/dir + +# Overrides the default location of the pacman log file. +# The default is /var/log/pacman.log. +# This is an absolute path and the root directory is not prepended. +LogFile = /path/to/log/file + +# If a user tries to --remove a package that’s listed in HoldPkg, pacman will ask for confirmation before proceeding. Shell-style glob patterns are allowed. +HoldPkg = package ... + +# Instructs pacman to ignore any upgrades for this package when performing a --sysupgrade. Shell-style glob patterns are allowed. +IgnorePkg = package ... + +# Instructs pacman to ignore any upgrades for all packages in this group when performing a --sysupgrade. Shell-style glob patterns are allowed. +IgnoreGroup = group ... + +# Include another configuration file. +# This file can include repositories or general configuration options. +# Wildcards in the specified paths will get expanded based on glob rules. +Include = /path/to/config/file + +# If set, pacman will only allow installation of packages with the given architectures (e.g. i686, x86_64, etc). +# The special value auto will use the system architecture, provided via “uname -m”. +# If unset, no architecture checks are made. +# NOTE: Packages with the special architecture any can always be installed, as they are meant to be architecture independent. +Architecture = auto &| i686 &| x86_64 | ... + +# If set, an external program will be used to download all remote files. +# All instances of %u will be replaced with the download URL. +# If present, instances of %o will be replaced with the local filename, plus a “.part” extension, which allows programs like wget to do file resumes properly. +XferCommand = /path/to/command %u [%o] + +# All files listed with a NoUpgrade directive will never be touched during a package install/upgrade, and the new files will be installed with a .pacnew extension. +# These files refer to files in the package archive, so do not include the leading slash (the RootDir) when specifying them. +# Shell-style glob patterns are allowed. It is possible to invert matches by prepending a file with an exclamation mark. +# Inverted files will result in previously blacklisted files being whitelisted again. Subsequent matches will override previous ones. +# A leading literal exclamation mark or backslash needs to be escaped. +NoUpgrade = file ... + +# All files listed with a NoExtract directive will never be extracted from a package into the filesystem. +# This can be useful when you don’t want part of a package to be installed. +# For example, if your httpd root uses an index.php, then you would not want the index.html file to be extracted from the apache package. +# These files refer to files in the package archive, so do not include the leading slash (the RootDir) when specifying them. +# Shell-style glob patterns are allowed. It is possible to invert matches by prepending a file with an exclamation mark. +# Inverted files will result in previously blacklisted files being whitelisted again. Subsequent matches will override previous ones. +# A leading literal exclamation mark or backslash needs to be escaped. +NoExtract = file ... + +# If set to KeepInstalled (the default), the -Sc operation will clean packages that are no longer installed (not present in the local database). +# If set to KeepCurrent, -Sc will clean outdated packages (not present in any sync database). +# The second behavior is useful when the package cache is shared among multiple machines, where the local databases are usually different, but the sync databases in use could be the same. +# If both values are specified, packages are only cleaned if not installed locally and not present in any known sync database. +CleanMethod = KeepInstalled &| KeepCurrent + +# Set the default signature verification level. For more information, see Package and Database Signature Checking below. +SigLevel = ... + +# Set the signature verification level for installing packages using the "-U" operation on a local file. Uses the value from SigLevel as the default. +LocalFileSigLevel = ... + +# Set the signature verification level for installing packages using the "-U" operation on a remote file URL. Uses the value from SigLevel as the default. +RemoteFileSigLevel = ... + +# Log action messages through syslog(). +# This will insert log entries into /var/log/messages or equivalent. +UseSyslog + +# Automatically enable colors only when pacman’s output is on a tty. +Color + +# Disables progress bars. This is useful for terminals which do not support escape characters. +NoProgressBar + +# Performs an approximate check for adequate available disk space before installing packages. +CheckSpace + +# Displays name, version and size of target packages formatted as a table for upgrade, sync and remove operations. +VerbosePkgLists + +# Disable defaults for low speed limit and timeout on downloads. +# Use this if you have issues downloading files with proxy and/or security gateway. +DisableDownloadTimeout + +# Specifies number of concurrent download streams. +# The value needs to be a positive integer. +# If this config option is not set then only one download stream is used (i.e. downloads happen sequentially). +ParallelDownloads = ... + +# Specifies the user to switch to for downloading files. +# If this config option is not set then the downloads are done as the user running pacman. +DownloadUser = username + +# Disable the default sandbox applied to the process downloading files on Linux systems. +# Useful if experiencing landlock related failures while downloading files when running a Linux kernel that does not support this feature. +DisableSandbox +``` + +### Repository Sections +Each repository section defines a section name and at least one location where the packages can be found. The section name is defined by the string within square brackets (the two above are core and custom). Repository names must be unique and the name local is reserved for the database of installed packages. Locations are defined with the Server directive and follow a URL naming structure. If you want to use a local directory, you can specify the full path with a `file://` prefix, as shown above. + +A common way to define DB locations utilizes the Include directive. For each repository defined in the configuration file, a single Include directive can contain a file that lists the servers for that repository. + +```ini +[core] +# use this server first +Server = ftp://ftp.archlinux.org/$repo/os/$arch +# next use servers as defined in the mirrorlist below +Include = {sysconfdir}/pacman.d/mirrorlist + +# Include another config file. +Include = path + +# A full URL to a location where the packages, and signatures (if available) for this repository can be found. +# Cache servers will be tried before any non-cache servers, will not be removed from the server pool for 404 download errors, and will not be used for database files. +CacheServer = url + +# A full URL to a location where the database, packages, and signatures (if available) for this repository can be found. +Server = url + +# Set the signature verification level for this repository. For more information, see Package and Database Signature Checking below. +SigLevel = ... + +# Set the usage level for this repository. This option takes a list of tokens which must be at least one of the following: +# Sync : Enables refreshes for this repository. +# Search : Enables searching for this repository. +# Install : Enables installation of packages from this repository during a --sync operation. +# Upgrade : Allows this repository to be a valid source of packages when performing a --sysupgrade. +# All : Enables all of the above features for the repository. This is the default if not specified. +# Note that an enabled repository can be operated on explicitly, regardless of the Usage level set. +Usage = ... +``` + +### Signature Checking +The `SigLevel` directive is valid in both the `[options]` and repository sections. If used in `[options]`, it sets a default value for any repository that does not provide the setting. +- If set to `Never`, no signature checking will take place. +- If set to `Optional` , signatures will be checked when present, but unsigned databases and packages will also be accepted. +- If set to `Required`, signatures will be required on all packages and databases. + +### Hooks +libalpm provides the ability to specify hooks to run before or after transactions based on the packages and/or files being modified. Hooks consist of a single `[Action]` section describing the action to be run and one or more `[Trigger]` section describing which transactions it should be run for. + +Hooks are read from files located in the system hook directory `/usr/share/libalpm/hooks`, and additional custom directories specified in pacman.conf (the default is `/etc/pacman.d/hooks`). The file names are required to have the suffix `.hook`. Hooks are run in alphabetical order of their file name, where the ordering ignores the suffix. + +Hooks may be overridden by placing a file with the same name in a higher priority hook directory. Hooks may be disabled by overriding them with a symlink to `/dev/null`. + +Hooks must contain at least one `[Trigger]` section that determines which transactions will cause the hook to run. If multiple trigger sections are defined the hook will run if the transaction matches any of the triggers. + +```ini +# Example: Force disks to sync to reduce the risk of data corruption + +[Trigger] +# Select the type of operation to match targets against. +# May be specified multiple times. +# Installations are considered an upgrade if the package or file is already present on the system regardless of whether the new package version is actually greater than the currently installed version. For Path triggers, this is true even if the file changes ownership from one package to another. +# Operation = Install | Upgrade | Remove +Operation = Install +Operation = Upgrade +Operation = Remove + +# Select whether targets are matched against transaction packages or files. +# Type = Path|Package +Type = Package + +# The path or package name to match against the active transaction. +# Paths refer to the files in the package archive; the installation root should not be included in the path. +# Shell-style glob patterns are allowed. It is possible to invert matches by prepending a target with an exclamation mark. May be specified multiple times. +# Target = +Target = * + +[Action] +# An optional description that describes the action being taken by the hook for use in front-end output. +# Description = ... + +# Packages that must be installed for the hook to run. May be specified multiple times. +# Depends = +Depends = coreutils + +# When to run the hook. Required. +# When = PreTransaction | PostTransaction +When = PostTransaction + +# Command to run. +# Command arguments are split on whitespace. Values containing whitespace should be enclosed in quotes. +# Exec = +Exec = /usr/bin/sync + +# Causes the transaction to be aborted if the hook exits non-zero. Only applies to PreTransaction hooks. +# AbortOnFail + +# Causes the list of matched trigger targets to be passed to the running hook on stdin. +# NeedsTargets +``` + +## Repositories +You can create your own package repository. + +A repository essentially consists of: +- the packages (`.tar.zst`) and their signatures (`.tar.zst.sig`) +- a package index (`.db.tar.gz`) + +### Adding a repo +To use a repo, add it to your `pacman.conf`: + +```ini + +# Local Repository +[myrepo] +SigLevel = Optional TrustAll +Server = file:///path/to/myrepo + +# Remote Repository +[myrepo] +SigLevel = Optional +Server = http://yourserver.com/myrepo +``` + +### Package Database +To manage the package data (index) use the `repo-add` and `repo-remove` commands. + +`repo-add` will update a package database by reading a built package file. Multiple packages to add can be specified on the command line. +If a matching `.sig` file is found alongside a package file, the signature will automatically be embedded into the database. + +`repo-remove` will update a package database by removing the package name specified on the command line. Multiple packages to remove can be specified on the command line. + +```sh +repo-add [options] [ ...] +repo-remove [options] [ ...] +``` + +| Option | Description | +| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-q, --quiet` | Force this program to keep quiet and run silently except for warning and error messages. | +| `-s, --sign` | Generate a PGP signature file using GnuPG. This will execute `gpg --detach-sign` on the generated database to generate a detached signature file, using the GPG agent if it is available. | +| `-k, --key ` | Specify a key to use when signing packages. Can also be specified using the `GPGKEY` environment variable. If not specified in either location, the default key from the keyring will be used. | +| `-v, --verify` | Verify the PGP signature of the database before updating the database. If the signature is invalid, an error is produced and the update does not proceed. | +| `--nocolor` | Remove color from repo-add and repo-remove output. | +| **`repo-add` ONLY OPTIONS:** | - | +| `-n, --new` | Only add packages that are not already in the database. Warnings will be printed upon detection of existing packages, but they will not be re-added. | +| `-R, --remove` | Remove old package files from the disk when updating their entry in the database. | +| `--include-sigs` | Include package PGP signatures in the repository database (if available) | + +## Package Signing +To determine if packages are authentic, pacman uses OpenPGP keys in a web of trust model. Each user also has a unique OpenPGP key, which is generated when you configure `pacman-key`. + +Examples of webs of trust: +- Custom packages: Packages made and signed with a local key. +- Unofficial packages: Packages made and signed by a developer. Then, a local key was used to sign the developer's key. +- Official packages: Packages made and signed by a developer. The developer's key was signed by the Arch Linux master keys. You used your key to sign the master keys, and you trust them to vouch for developers. + +### Setup +The `SigLevel` option in `/etc/pacman.conf` determines the level of trust required to install a package with `pacman -S`. One can set signature checking globally, or per repository. If `SigLevel` is set globally in the `[options]` section, all packages installed with `pacman -S` will require signing. With the `LocalFileSigLevel` setting from the default `pacman.conf`, any packages you build, and install with `pacman -U`, will not need to be signed using `makepkg`. + +For remote packages, the default configuration will only support the installation of packages signed by trusted keys: + +``` +# /etc/pacman.conf +SigLevel = Required DatabaseOptional TrustedOnly +``` + +To initialize the pacman keyring run: + +```sh +pacman-key --init +``` + +### Keyring Management +#### Verifying the master keys +The initial setup of keys is achieved using: + +```sh +pacman-key --populate +``` + +OpenPGP keys are too large (2048 bits or more) for humans to work with, so they are usually hashed to create a 40-hex-digit fingerprint which can be used to check by hand that two keys are the same. The last eight digits of the fingerprint serve as a name for the key known as the '(short) key ID' (the last sixteen digits of the fingerprint would be the 'long key ID'). + +#### Adding developer keys +The official Developers' and Package Maintainers' keys are signed by the master keys, so you do not need to use `pacman-key` to sign them yourself. Whenever pacman encounters a key it does not recognize, it will prompt you to download it from a keyserver configured in `/etc/pacman.d/gnupg/gpg.conf` (or by using the `--keyserver` option on the command line). + +Once you have downloaded a developer key, you will not have to download it again, and it can be used to verify any other packages signed by that developer. + +> **Note**: The `archlinux-keyring` package, which is a dependency of base, contains the latest keys. However keys can also be updated manually using `pacman-key --refresh-keys` (as root). While doing `--refresh-keys`, your local key will also be looked up on the remote keyserver, and you will receive a message about it not being found. This is nothing to be concerned about. + +#### Adding unofficial keys +This method can be utilized to add a key to the pacman keyring, or to enable signed unofficial user repositories. + +First, get the key ID (keyid) from its owner. Then add it to the keyring using one of the two methods: + +If the key is found on a keyserver, import it with: + +```sh +pacman-key --recv-keys keyid +``` + +If otherwise a link to a keyfile is provided, download it and then run: + +```sh +pacman-key --add /path/to/downloaded/keyfile +``` + +It is recommended to verify the fingerprint, as with any master key or any other key you are going to sign: + +```sh +pacman-key --finger keyid +``` + +Finally, you must locally sign the imported key: + +```sh +pacman-key --lsign-key keyid +``` + +You now trust this key to sign packages. diff --git a/technology/applications/package managers/arch-linux/makepkg.md b/technology/applications/package managers/arch-linux/makepkg.md index cabb0d2..0ccc6b6 100644 --- a/technology/applications/package managers/arch-linux/makepkg.md +++ b/technology/applications/package managers/arch-linux/makepkg.md @@ -1,11 +1,190 @@ --- arch-wiki: https://wiki.archlinux.org/title/Makepkg obj: application +rev: 2024-12-19 --- # makepkg makepkg is a tool for creating [pacman](Pacman.md) packages based on [PKGBUILD](PKGBUILD.md) files. +## Configuration +The system configuration is available in `/etc/makepkg.conf`, but user-specific changes can be made in `$XDG_CONFIG_HOME/pacman/makepkg.conf` or `~/.makepkg.conf`. Also, system wide changes can be made with a drop-in file `/etc/makepkg.conf.d/makepkg.conf`. It is recommended to review the configuration prior to building packages. + +> **Tip**: devtools helper scripts for building packages in a clean chroot use the `/usr/share/devtools/makepkg.conf.d/arch.conf` configuration file instead. + +```sh +#!/hint/bash +# shellcheck disable=2034 + +# +# /etc/makepkg.conf +# + +######################################################################### +# SOURCE ACQUISITION +######################################################################### +# +#-- The download utilities that makepkg should use to acquire sources +# Format: 'protocol::agent' +DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u' + 'ftp::/usr/bin/curl -qgfC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u' + 'http::/usr/bin/curl -qgb "" -fLC - --retry 3 --retry-delay 3 -o %o %u' + 'https::/usr/bin/curl -qgb "" -fLC - --retry 3 --retry-delay 3 -o %o %u' + 'rsync::/usr/bin/rsync --no-motd -z %u %o' + 'scp::/usr/bin/scp -C %u %o') + +# Other common tools: +# /usr/bin/snarf +# /usr/bin/lftpget -c +# /usr/bin/wget + +#-- The package required by makepkg to download VCS sources +# Format: 'protocol::package' +VCSCLIENTS=('bzr::breezy' + 'fossil::fossil' + 'git::git' + 'hg::mercurial' + 'svn::subversion') + +######################################################################### +# ARCHITECTURE, COMPILE FLAGS +######################################################################### +# +CARCH="x86_64" +CHOST="x86_64-pc-linux-gnu" + +#-- Compiler and Linker Flags +#CPPFLAGS="" +CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \ + -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \ + -fstack-clash-protection -fcf-protection \ + -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer" +CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS" +LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now \ + -Wl,-z,pack-relative-relocs" +LTOFLAGS="-flto=auto" +#-- Make Flags: change this for DistCC/SMP systems +MAKEFLAGS="-j8" +#-- Debugging flags +DEBUG_CFLAGS="-g" +DEBUG_CXXFLAGS="$DEBUG_CFLAGS" + +######################################################################### +# BUILD ENVIRONMENT +######################################################################### +# +# Makepkg defaults: BUILDENV=(!distcc !color !ccache check !sign) +# A negated environment option will do the opposite of the comments below. +# +#-- distcc: Use the Distributed C/C++/ObjC compiler +#-- color: Colorize output messages +#-- ccache: Use ccache to cache compilation +#-- check: Run the check() function if present in the PKGBUILD +#-- sign: Generate PGP signature file +# +BUILDENV=(!distcc color !ccache check !sign) + +# +#-- If using DistCC, your MAKEFLAGS will also need modification. In addition, +#-- specify a space-delimited list of hosts running in the DistCC cluster. +#DISTCC_HOSTS="" + +#-- Specify a directory for package building. +BUILDDIR=/tmp/makepkg + +######################################################################### +# GLOBAL PACKAGE OPTIONS +# These are default values for the options=() settings +######################################################################### +# +# Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto !autodeps) +# A negated option will do the opposite of the comments below. +# +#-- strip: Strip symbols from binaries/libraries +#-- docs: Save doc directories specified by DOC_DIRS +#-- libtool: Leave libtool (.la) files in packages +#-- staticlibs: Leave static library (.a) files in packages +#-- emptydirs: Leave empty directories in packages +#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip +#-- purge: Remove files specified by PURGE_TARGETS +#-- debug: Add debugging flags as specified in DEBUG_* variables +#-- lto: Add compile flags for building with link time optimization +#-- autodeps: Automatically add depends/provides +# +OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !debug lto) + +#-- File integrity checks to use. Valid: md5, sha1, sha224, sha256, sha384, sha512, b2 +INTEGRITY_CHECK=(sha256) +#-- Options to be used when stripping binaries. See `man strip' for details. +STRIP_BINARIES="--strip-all" +#-- Options to be used when stripping shared libraries. See `man strip' for details. +STRIP_SHARED="--strip-unneeded" +#-- Options to be used when stripping static libraries. See `man strip' for details. +STRIP_STATIC="--strip-debug" +#-- Manual (man and info) directories to compress (if zipman is specified) +MAN_DIRS=({usr{,/local}{,/share},opt/*}/{man,info}) +#-- Doc directories to remove (if !docs is specified) +DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc}) +#-- Files to be removed from all packages (if purge is specified) +PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod) +#-- Directory to store source code in for debug packages +DBGSRCDIR="/usr/src/debug" +#-- Prefix and directories for library autodeps +LIB_DIRS=('lib:usr/lib' 'lib32:usr/lib32') + +######################################################################### +# PACKAGE OUTPUT +######################################################################### +# +# Default: put built package and cached source in build directory +# +#-- Destination: specify a fixed directory where all packages will be placed +PKGDEST=/home/packages + +#-- Source cache: specify a fixed directory where source files will be cached +SRCDEST=/home/sources + +#-- Source packages: specify a fixed directory where all src packages will be placed +SRCPKGDEST=/home/srcpackages + +#-- Log files: specify a fixed directory where all log files will be placed +#LOGDEST=/home/makepkglogs + +#-- Packager: name/email of the person or organization building packages +PACKAGER="John Doe " +#-- Specify a key to use for package signing +GPGKEY="" + +######################################################################### +# COMPRESSION DEFAULTS +######################################################################### +# +COMPRESSGZ=(gzip -c -f -n) +COMPRESSBZ2=(bzip2 -c -f) +COMPRESSXZ=(xz -c -z -) +COMPRESSZST=(zstd -c -T0 -) +COMPRESSLRZ=(lrzip -q) +COMPRESSLZO=(lzop -q) +COMPRESSZ=(compress -c -f) +COMPRESSLZ4=(lz4 -q) +COMPRESSLZ=(lzip -c -f) + +######################################################################### +# EXTENSION DEFAULTS +######################################################################### +# +PKGEXT='.pkg.tar.zst' +SRCEXT='.src.tar.gz' + +######################################################################### +# OTHER +######################################################################### +# +#-- Command used to run pacman as root, instead of trying sudo and su +#PACMAN_AUTH=() +# vim: set ft=sh ts=2 sw=2 et: +``` + ## Usage Make a package: ```shell @@ -38,22 +217,102 @@ makepkg --verifysource ``` ## Options -| Option | Description | -| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `-A, --ignorearch` | Ignore a missing or incomplete arch field in the build script | -| `-c, --clean` | Clean up leftover work files and directories after a successful build | -| `-d, --nodeps` | Do not perform any dependency checks. This will let you override and ignore any dependencies required. There is a good chance this option will break the build process if all of the dependencies are not installed | +| Option | Description | +| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-A, --ignorearch` | Ignore a missing or incomplete arch field in the build script | +| `-c, --clean` | Clean up leftover work files and directories after a successful build | +| `-d, --nodeps` | Do not perform any dependency checks. This will let you override and ignore any dependencies required. There is a good chance this option will break the build process if all of the dependencies are not installed | | `-e, --noextract` | Do not extract source files or run the prepare() function (if present); use whatever source already exists in the $srcdir/ directory. This is handy if you want to go into $srcdir/ and manually patch or tweak code, then make a package out of the result. Keep in mind that creating a patch may be a better solution to allow others to use your [PKGBUILD](PKGBUILD.md). | -| `--skipinteg` | Do not perform any integrity checks (checksum and [PGP](../../../cryptography/GPG.md)) on source files | -| `--skipchecksums` | Do not verify checksums of source files | -| `--skippgpcheck` | Do not verify [PGP](../../../cryptography/GPG.md) signatures of source files | -| `-i, --install` | Install or upgrade the package after a successful build using [pacman](Pacman.md) | -| `-o, --nobuild` | Download and extract files, run the prepare() function, but do not build them. Useful with the `--noextract` option if you wish to tweak the files in $srcdir/ before building | -| `-r, --rmdeps` | Upon successful build, remove any dependencies installed by makepkg during dependency auto-resolution and installation | -| `-s, --syncdeps` | Install missing dependencies using [pacman](Pacman.md). When build-time or run-time dependencies are not found, [pacman](Pacman.md) will try to resolve them. If successful, the missing packages will be downloaded and installed | -| `-C, --cleanbuild` | Remove the $srcdir before building the package | -| `--noarchive` | Do not create the archive at the end of the build process. This can be useful to test the package() function or if your target distribution does not use [pacman](Pacman.md) | -| `--sign` | Sign the resulting package with [gpg](../../../cryptography/GPG.md) | -| `--nosign` | Do not create a signature for the built package | -| `--key ` | Specify a key to use when signing packages | -| `--noconfirm` | (Passed to [pacman](Pacman.md)) Prevent [pacman](Pacman.md) from waiting for user input before proceeding with operations | +| `--skipinteg` | Do not perform any integrity checks (checksum and [PGP](../../../cryptography/GPG.md)) on source files | +| `--skipchecksums` | Do not verify checksums of source files | +| `--skippgpcheck` | Do not verify [PGP](../../../cryptography/GPG.md) signatures of source files | +| `-i, --install` | Install or upgrade the package after a successful build using [pacman](Pacman.md) | +| `-o, --nobuild` | Download and extract files, run the prepare() function, but do not build them. Useful with the `--noextract` option if you wish to tweak the files in $srcdir/ before building | +| `-r, --rmdeps` | Upon successful build, remove any dependencies installed by makepkg during dependency auto-resolution and installation | +| `-s, --syncdeps` | Install missing dependencies using [pacman](Pacman.md). When build-time or run-time dependencies are not found, [pacman](Pacman.md) will try to resolve them. If successful, the missing packages will be downloaded and installed | +| `-C, --cleanbuild` | Remove the $srcdir before building the package | +| `-f, --force` | Overwrite package if it already exists | +| `--noarchive` | Do not create the archive at the end of the build process. This can be useful to test the package() function or if your target distribution does not use [pacman](Pacman.md) | +| `--sign` | Sign the resulting package with [gpg](../../../cryptography/GPG.md) | +| `--nosign` | Do not create a signature for the built package | +| `--key ` | Specify a key to use when signing packages | +| `--noconfirm` | (Passed to [pacman](Pacman.md)) Prevent [pacman](Pacman.md) from waiting for user input before proceeding with operations | + +## Misc +### Using mold linker +[mold](../../development/mold.md) is a drop-in replacement for ld/lld linkers, which claims to be significantly faster. + +To use mold, append `-fuse-ld=mold` to `LDFLAGS`. For example: + +```sh +# /etc/makepkg.conf + +LDFLAGS="... -fuse-ld=mold" +``` + +To pass extra options to mold, additionally add those to `LDFLAGS`. For example: + +```sh +# /etc/makepkg.conf + +LDFLAGS="... -fuse-ld=mold -Wl,--separate-debug-file" +``` + +To use mold for Rust packages, append `-C link-arg=-fuse-ld=mold` to `RUSTFLAGS`. For example: + +```sh +# /etc/makepkg.conf.d/rust.conf + +RUSTFLAGS="... -C link-arg=-fuse-ld=mold" +``` + +### Parallel compilation +The make build system uses the `MAKEFLAGS` environment variable to specify additional options for make. The variable can also be set in the `makepkg.conf` file. + +Users with multi-core/multi-processor systems can specify the number of jobs to run simultaneously. This can be accomplished with the use of `nproc` to determine the number of available processors, e.g. + +```sh +MAKEFLAGS="--jobs=$(nproc)". +``` + +Some `PKGBUILDs` specifically override this with `-j1`, because of race conditions in certain versions or simply because it is not supported in the first place. + +### Building from files in memory +As compiling requires many I/O operations and handling of small files, moving the working directory to a [tmpfs](../../../linux/filesystems/tmpFS.md) may bring improvements in build times. + +The `BUILDDIR` variable can be temporarily exported to makepkg to set the build directory to an existing tmpfs. For example: + +```sh +BUILDDIR=/tmp/makepkg makepkg +``` + +Persistent configuration can be done in `makepkg.conf` by uncommenting the `BUILDDIR` option, which is found at the end of the BUILD ENVIRONMENT section in the default `/etc/makepkg.conf` file. Setting its value to e.g. `BUILDDIR=/tmp/makepkg` will make use of the Arch's default `/tmp` temporary file system. + +> **Note:** +> - Avoid compiling larger packages in tmpfs to prevent running out of memory. +> - The tmpfs directory must be mounted without the `noexec` option, otherwise it will prevent built binaries from being executed. +> - Keep in mind that packages compiled in tmpfs will not persist across reboot. Consider setting the `PKGDEST` option appropriately to move the built package automatically to a persistent directory. + +### Generate new checksums +Install `pacman-contrib` and run the following command in the same directory as the [PKGBUILD](./PKGBUILD.md) file to generate new checksums: + +```sh +updpkgsums +``` + +`updpkgsums` uses `makepkg --geninteg` to generate the checksums. + +The checksums can also be obtained with e.g `sha256sum` and added to the `sha256sums` array by hand. + +### Build from local source files +If you want to make changes to the source code you can download the source code without building the package by using the `-o, --nobuild` Download and extract files only option. + +```sh +makepkg -o +``` + +You can now make changes to the sources and then build the package by using the `-e, --noextract` Do not extract source files (use existing `$srcdir/` dir) option. Use the `-f` option to overwrite already built and existing packages. + +```sh +makepkg -ef +``` From 59623955d4662cd72ab64830db162809ba4de244 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Fri, 20 Dec 2024 08:59:41 +0100 Subject: [PATCH 23/99] add overlayfs --- technology/linux/filesystems/Filesystems.md | 1 + technology/linux/filesystems/overlayfs.md | 60 +++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 technology/linux/filesystems/overlayfs.md diff --git a/technology/linux/filesystems/Filesystems.md b/technology/linux/filesystems/Filesystems.md index a1ad939..d862ec9 100644 --- a/technology/linux/filesystems/Filesystems.md +++ b/technology/linux/filesystems/Filesystems.md @@ -15,6 +15,7 @@ obj: meta/collection - [LVM](./LVM.md) - [LUKS](./LUKS.md) - [tmpFS](./tmpFS.md) +- [overlayfs](./overlayfs.md) ## Network - [SSHFS](SSHFS.md) diff --git a/technology/linux/filesystems/overlayfs.md b/technology/linux/filesystems/overlayfs.md new file mode 100644 index 0000000..7683d45 --- /dev/null +++ b/technology/linux/filesystems/overlayfs.md @@ -0,0 +1,60 @@ +--- +obj: filesystem +arch-wiki: https://wiki.archlinux.org/title/Overlay_filesystem +source: https://docs.kernel.org/filesystems/overlayfs.html +wiki: https://en.wikipedia.org/wiki/OverlayFS +rev: 2024-12-19 +--- + +# OverlayFS +Overlayfs allows one, usually read-write, directory tree to be overlaid onto another, read-only directory tree. All modifications go to the upper, writable layer. This type of mechanism is most often used for live CDs but there is a wide variety of other uses. + +The implementation differs from other "union filesystem" implementations in that after a file is opened all operations go directly to the underlying, lower or upper, filesystems. This simplifies the implementation and allows native performance in these cases. + +## Usage +To mount an overlay use the following mount options: + +```sh +mount -t overlay overlay -o lowerdir=/lower,upperdir=/upper,workdir=/work /merged +``` + +> **Note**: +> - The working directory (`workdir`) needs to be an empty directory on the same filesystem as the upper directory. +> - The lower directory can be read-only or could be an overlay itself. +> - The upper directory is normally writable. +> - The workdir is used to prepare files as they are switched between the layers. + +The lower directory can actually be a list of directories separated by `:`, all changes in the merged directory are still reflected in upper. + +### Read-only overlay +Sometimes, it is only desired to create a read-only view of the combination of two or more directories. In that case, it can be created in an easier manner, as the directories `upper` and `work` are not required: + +```sh +mount -t overlay overlay -o lowerdir=/lower1:/lower2 /merged +``` + +When `upperdir` is not specified, the overlay is automatically mounted as read-only. + +## Example: + +```sh +mount -t overlay overlay -o lowerdir=/lower1:/lower2:/lower3,upperdir=/upper,workdir=/work /merged +``` + +> **Note**: The order of lower directories is the rightmost is the lowest, thus the upper directory is on top of the first directory in the left-to-right list of lower directories; NOT on top of the last directory in the list, as the order might seem to suggest. + +The above example will have the order: + +- /upper +- /lower1 +- /lower2 +- /lower3 + +To add an overlayfs entry to `/etc/fstab` use the following format: + +``` +# /etc/fstab +overlay /merged overlay noauto,x-systemd.automount,lowerdir=/lower,upperdir=/upper,workdir=/work 0 0 +``` + +The `noauto` and `x-systemd.automount` mount options are necessary to prevent systemd from hanging on boot because it failed to mount the overlay. The overlay is now mounted whenever it is first accessed and requests are buffered until it is ready. From cd03683f24d38580c0ca4e0e4636d3098079187d Mon Sep 17 00:00:00 2001 From: JMARyA Date: Fri, 20 Dec 2024 09:52:58 +0100 Subject: [PATCH 24/99] add plymouth --- technology/linux/Plymouth.md | 105 +++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 technology/linux/Plymouth.md diff --git a/technology/linux/Plymouth.md b/technology/linux/Plymouth.md new file mode 100644 index 0000000..3c63029 --- /dev/null +++ b/technology/linux/Plymouth.md @@ -0,0 +1,105 @@ +--- +obj: application +arch-wiki: https://wiki.archlinux.org/title/Plymouth +rev: 2024-12-20 +--- + +# Plymouth +Plymouth is a project from Fedora providing a flicker-free graphical boot process. It relies on kernel mode setting (KMS) to set the native resolution of the display as early as possible, then provides an eye-candy splash screen leading all the way up to the login manager. + +## Setup +By default, Plymouth logs the boot messages into `/var/log/boot.log`, and does not show the graphical splash screen. +- If you want to see the splash screen, append `splash` to the kernel parameters. +- If you want silent boot, append `quiet` too. +- If you want to disable the logging, append `plymouth.boot-log=/dev/null`. Alternatively, add `plymouth.nolog` which also disables console redirection. + +To start Plymouth on early boot, you must configure your initramfs generator to create images including Plymouth. + +For mkinitcpio, add plymouth to the `HOOKS` array in `mkinitcpio.conf`: + +```sh +# /etc/mkinitcpio.conf + +HOOKS=(... plymouth ...) +``` + +If you are using the `systemd` hook, it must be before `plymouth`. + +Furthermore make sure you place `plymouth` before the `crypt` hook if your system is encrypted with dm-crypt. + +## Configuration +Plymouth can be configured in file `/etc/plymouth/plymouthd.conf`. You can see the default values in `/usr/share/plymouth/plymouthd.defaults`. + +### Changing the theme +Plymouth comes with a selection of themes: +- BGRT: A variation of Spinner that keeps the OEM logo if available (BGRT stands for Boot Graphics Resource Table) +- Fade-in: "Simple theme that fades in and out with shimmering stars" +- Glow: "Corporate theme with pie chart boot progress followed by a glowing emerging logo" +- Script: "Script example plugin" (Despite the description seems to be a quite nice Arch logo theme) +- Solar: "Space theme with violent flaring blue star" +- Spinner: "Simple theme with a loading spinner" +- Spinfinity: "Simple theme that shows a rotating infinity sign in the center of the screen" +- Tribar: "Text mode theme with tricolor progress bar" +- (Text: "Text mode theme with tricolor progress bar") +- (Details: "Verbose fallback theme") + +The theme can be changed by editing the configuration file: + +```ini +# /etc/plymouth/plymouthd.conf + +[Daemon] +Theme=theme +``` + +or by running: + +```sh +plymouth-set-default-theme -R theme +``` + +Every time a theme is changed, the initrd must be rebuilt. The `-R` option ensures that it is rebuilt (otherwise regenerate the initramfs manually). + +### Install new themes +All currently installed themes can be listed by using this command: + +```sh +plymouth-set-default-theme -l +# or: +ls /usr/share/plymouth/themes +``` + +### Show delay +Plymouth has a configuration option to delay the splash screen: + +```ini +# /etc/plymouth/plymouthd.conf + +[Daemon] +ShowDelay=5 +``` + +On systems that boot quickly, you may only see a flicker of your splash theme before your DM or login prompt is ready. You can set `ShowDelay` to an interval (in seconds) longer than your boot time to prevent this flicker and only show a blank screen. The default is 0 seconds, so you should not need to change this to a different value to see your splash earlier during boot. + +### HiDPI +Edit the configuration file: + +```ini +# /etc/plymouth/plymouthd.conf + +[Daemon] +DeviceScale=an-integer-scaling-factor +``` + +and regenerate the initramfs. + +## Misc +### Show boot messages +During boot you can switch to boot messages by pressing the `Esc` key. + +### Disable with kernel parameters +If you experience problems during boot, you can temporary disable Plymouth with the following kernel parameters: + +``` +plymouth.enable=0 disablehooks=plymouth +``` From adc93877f4d672c543ce008faf267a574645a289 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Fri, 20 Dec 2024 12:45:40 +0100 Subject: [PATCH 25/99] update linux --- technology/linux/Linux.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/technology/linux/Linux.md b/technology/linux/Linux.md index 7fced99..0a2c645 100644 --- a/technology/linux/Linux.md +++ b/technology/linux/Linux.md @@ -43,3 +43,41 @@ A typical Linux system has, among others, the following directories: | `/var` | This directory contains files which may change in size, such as spool and [log](../dev/Log.md) files. | | `/var/cache` | Data cached for programs. | | `/var/log` | Miscellaneous [log](../dev/Log.md) files. | +## Kernel Commandline +The kernel, the programs running in the initrd and in the host system may be configured at boot via kernel command line arguments. + +The current cmdline can be seen at `/proc/cmdline`. +For setting the cmdline use `/etc/kernel/cmdline` if you use UKIs. + +**Common Kernel Cmdline Arguments:** + +| Argument | Description | +| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `quiet` | Parameter understood by both the kernel and the system and service manager to control console log verbosity. | +| `splash` | Show a plymouth splash screen while booting. | +| `init=` | This sets the initial command to be executed by the kernel. If this is not set, or cannot be found, the kernel will try `/sbin/init`, then `/etc/init`, then `/bin/init`, then `/bin/sh` and panic if all of this fails. | +| `ro` and `rw` | The `ro` option tells the kernel to mount the root filesystem as 'read-only'. The `rw` option tells the kernel to mount the root filesystem read/write. This is the default. | +| `resume=...` | This tells the kernel the location of the suspend-to-disk data that you want the machine to resume from after hibernation. Usually, it is the same as your swap partition or file. Example: `resume=/dev/hda2` | +| `panic=N` | By default, the kernel will not reboot after a panic, but this option will cause a kernel reboot after `N` seconds (if `N` is greater than zero). This panic timeout can also be set by `echo N > /proc/sys/kernel/panic` | +| `plymouth.enable=` | May be used to disable the Plymouth boot splash. For details, see plymouth. | +| `vconsole.keymap=, vconsole.keymap_toggle=, vconsole.font=, vconsole.font_map=, vconsole.font_unimap=` | Parameters understood by the virtual console setup logic. For details, see `vconsole.conf` | +| `luks=, rd.luks=` | Defaults to "yes". If "no", disables the crypt mount generator entirely. `rd.luks=` is honored only in the initrd while `luks=` is honored by both the main system and in the initrd. | +| `luks.crypttab=, rd.luks.crypttab=` | Defaults to "yes". If "no", causes the generator to ignore any devices configured in `/etc/crypttab` (`luks.uuid=` will still work however). `rd.luks.crypttab=` is honored only in initrd while `luks.crypttab=` is honored by both the main system and in the initrd. | +| `luks.uuid=, rd.luks.uuid=` | Takes a LUKS superblock UUID as argument. This will activate the specified device as part of the boot process as if it was listed in `/etc/crypttab`. This option may be specified more than once in order to set up multiple devices. `rd.luks.uuid=` is honored only in the initrd, while `luks.uuid=` is honored by both the main system and in the initrd. | +| `luks.name=, rd.luks.name=` | Takes a LUKS super block UUID followed by an `=` and a name. This implies `rd.luks.uuid=` or `luks.uuid=` and will additionally make the LUKS device given by the UUID appear under the provided name. `rd.luks.name=` is honored only in the initrd, while `luks.name=` is honored by both the main system and in the initrd. | +| `luks.options=, rd.luks.options=` | Takes a LUKS super block UUID followed by an `=` and a string of options separated by commas as argument. This will override the options for the given UUID. If only a list of options, without a UUID, is specified, they apply to any UUIDs not specified elsewhere, and without an entry in `/etc/crypttab`. `rd.luks.options=` is honored only by initial RAM disk (initrd) while `luks.options=` is honored by both the main system and in the initrd. | +| `fstab=, rd.fstab=` | Defaults to "yes". If "no", causes the generator to ignore any mounts or swap devices configured in `/etc/fstab`. `rd.fstab=` is honored only in the initrd, while `fstab=` is honored by both the main system and the initrd. | +| `root=` | Configures the operating system's root filesystem to mount when running in the initrd. This accepts a device node path (usually `/dev/disk/by-uuid/...` or similar), or the special values `gpt-auto`, `fstab`, and `tmpfs`. Use `gpt-auto` to explicitly request automatic root file system discovery via `systemd-gpt-auto-generator`. Use `fstab` to explicitly request automatic root file system discovery via the initrd `/etc/fstab` rather than via kernel command line. Use `tmpfs` in order to mount a tmpfs file system as root file system of the OS. This is useful in combination with `mount.usr=` in order to combine a volatile root file system with a separate, immutable `/usr/` file system. Also see `systemd.volatile=` below. | +| `rootfstype=` | Takes the root filesystem type that will be passed to the mount command. `rootfstype=` is honored by the initrd. | +| `mount.usr=` | Takes the `/usr/` filesystem to be mounted by the initrd. If `mount.usrfstype=` or `mount.usrflags=` is set, then `mount.usr=` will default to the value set in `root=`. Otherwise, this parameter defaults to the `/usr/` entry found in `/etc/fstab` on the root filesystem. | +| `mount.usrfstype=` | Takes the `/usr` filesystem type that will be passed to the mount command. | +| `systemd.volatile=` | Controls whether the system shall boot up in volatile mode. | +| `systemd.swap=` | Takes a boolean argument or enables the option if specified without an argument. If disabled, causes the generator to ignore any swap devices configured in `/etc/fstab`. Defaults to enabled. | + +## Misc +### Cause a kernel panic +To manually cause a kernel panic run: + +```sh +echo c > /proc/sysrq-trigger +``` From 5c4b3e14bfadaf1c70d835ff5b9a723ebae61f27 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Fri, 20 Dec 2024 12:46:21 +0100 Subject: [PATCH 26/99] add zram --- technology/linux/Zram.md | 202 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 technology/linux/Zram.md diff --git a/technology/linux/Zram.md b/technology/linux/Zram.md new file mode 100644 index 0000000..aeddc32 --- /dev/null +++ b/technology/linux/Zram.md @@ -0,0 +1,202 @@ +--- +obj: concept +arch-wiki: https://wiki.archlinux.org/title/Zram +source: https://docs.kernel.org/admin-guide/blockdev/zram.html +wiki: https://en.wikipedia.org/wiki/Zram +rev: 2024-12-20 +--- + +# Zram +zram, formerly called compcache, is a Linux kernel module for creating a compressed block device in RAM, i.e. a RAM disk with on-the-fly disk compression. The block device created with zram can then be used for swap or as a general-purpose RAM disk. The two most common uses for zram are for the storage of temporary files (`/tmp`) and as a swap device. Initially, zram had only the latter function, hence the original name "compcache" ("compressed cache"). + +## Usage as swap +Initially the created zram block device does not reserve or use any RAM. Only as files need or want to be swapped out, they will be compressed and moved into the zram block device. The zram block device will then dynamically grow or shrink as required. + +Even when assuming that zstd only achieves a conservative 1:2 compression ratio (real world data shows a common ratio of 1:3), zram will offer the advantage of being able to store more content in RAM than without memory compression. + +### Manually +To set up one zstd compressed zram device with half the system memory capacity and a higher-than-normal priority (only for the current session): + +```sh +modprobe zram +zramctl /dev/zram0 --algorithm zstd --size "$(($(grep -Po 'MemTotal:\s*\K\d+' /proc/meminfo)/2))KiB" +mkswap -U clear /dev/zram0 +swapon --discard --priority 100 /dev/zram0 +``` + +To disable it again, either reboot or run: + +```sh +swapoff /dev/zram0 +modprobe -r zram +echo 1 > /sys/module/zswap/parameters/enabled +``` + +For a permanent solution, use a method from one of the following sections. + +### Using a udev rule +The example below describes how to set up swap on zram automatically at boot with a single udev rule. No extra package should be needed to make this work. + +Explicitly load the module at boot: + +```ini +# /etc/modules-load.d/zram.conf +zram +``` + +Create the following udev rule adjusting the disksize attribute as necessary: + +``` +# /etc/udev/rules.d/99-zram.rules +ACTION=="add", KERNEL=="zram0", ATTR{comp_algorithm}="zstd", ATTR{disksize}="4G", RUN="/usr/bin/mkswap -U clear /dev/%k", TAG+="systemd" +``` + +Add `/dev/zram` to your fstab with a higher than default priority: + +``` +# /etc/fstab +/dev/zram0 none swap defaults,discard,pri=100 0 0 +``` + +### Using zram-generator +`zram-generator` provides `systemd-zram-setup@zramN.service` units to automatically initialize zram devices without users needing to enable/start the template or its instances. + +To use it, install `zram-generator`, and create `/etc/systemd/zram-generator.conf` with the following: + +```ini +# /etc/systemd/zram-generator.conf + +[zram0] +zram-size = min(ram / 2, 4096) +compression-algorithm = zstd +``` + +`zram-size` is the size (in MiB) of zram device, you can use ram to represent the total memory. + +`compression-algorithm` specifies the algorithm used to compress in zram device. +`cat /sys/block/zram0/comp_algorithm` gives the available compression algorithm (as well as the current one included in brackets). + +Then run `daemon-reload`, start your configured `systemd-zram-setup@zramN.service` instance (`N` matching the numerical instance-ID, in the example it is `systemd-zram-setup@zram0.service`). + +You can check the swap status of your configured `/dev/zramN` device(s) by reading the unit status of your `systemd-zram-setup@zramN.service` instance(s), by using `zramctl`, or by using `swapon`. + +## zramctl +zramctl is used to quickly set up zram device parameters, to reset zram devices, and to query the status of used zram devices. + +Usage: +```sh +# Get info: +# If no option is given, all non-zero size zram devices are shown. +zramctl [options] + +# Reset zram: +zramctl -r zramdev... + +# Print name of first unused zram device: +zramctl -f + +# Set up a zram device: +zramctl [-f | zramdev] [-s size] [-t number] [-a algorithm] +``` + +### Options + +| Option | Description | +| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-a, --algorithm lzo/lz4/lz4hc/deflate/842/zstd` | Set the compression algorithm to be used for compressing data in the zram device. The list of supported algorithms could be inaccurate as it depends on the current kernel configuration. A basic overview can be obtained by using the command `cat /sys/block/zram0/comp_algorithm`; | +| `-f, --find` | Find the first unused zram device. If a `--size` argument is present, then initialize the device. | +| `-n, --noheadings` | Do not print a header line in status output. ` | +| `-o, --output list` | Define the status output columns to be used. If no output arrangement is specified, then a default set is used. See below for list of all supported columns. | +| `--output-all` | Output all available columns. | +| `--raw` | Use the raw format for status output. | +| `-r, --reset` | Reset the options of the specified zram device(s). Zram device settings can be changed only after a reset. | +| `-s, --size size` | Create a zram device of the specified size. Zram devices are aligned to memory pages; when the requested size is not a multiple of the page size, it will be rounded up to the next multiple. When not otherwise specified, the unit of the size parameter is bytes. | +| `-t, --streams number` | Set the maximum number of compression streams that can be used for the device. The default is use all CPUs and one stream for kernels older than 4.6. | + +### Output Columns + +| Output | Description | +| ------------ | ------------------------------------------------------------------ | +| `NAME` | zram device name | +| `DISKSIZE` | limit on the uncompressed amount of data | +| `DATA` | uncompressed size of stored data | +| `COMPR` | compressed size of stored data | +| `ALGORITHM` | the selected compression algorithm | +| `STREAMS` | number of concurrent compress operations | +| `ZERO-PAGES` | empty pages with no allocated memory | +| `TOTAL` | all memory including allocator fragmentation and metadata overhead | +| `MEM-LIMIT` | memory limit used to store compressed data | +| `MEM-USED` | memory zram has consumed to store compressed data | +| `MIGRATED` | number of objects migrated by compaction | +| `COMP-RATIO` | compression ratio: DATA/TOTAL | +| `MOUNTPOINT` | where the device is mounted | + +## Misc +### Checking zram statistics +Use zramctl. Example: + +``` +$ zramctl + +NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT +/dev/zram0 zstd 32G 1.9G 318.6M 424.9M 16 [SWAP] + + DISKSIZE = 32G: this zram device will store up to 32 GiB of uncompressed data. + DATA = 1.9G: currently, 1.9 GiB (uncompressed) of data is being stored in this zram device + COMPR = 318.6M: the 1.9 GiB uncompressed data was compressed to 318.6 MiB + TOTAL = 424.9M: including metadata, the 1.9 GiB of uncompressed data is using up 424.9 MiB of physical RAM +``` + +### Multiple zram devices +By default, loading the zram module creates a single `/dev/zram0` device. + +If you need more than one `/dev/zram` device, specify the amount using the `num_devices` kernel module parameter or add them as needed afterwards. + +### Optimizing swap on zram +Since zram behaves differently than disk swap, we can configure the system's swap to take full potential of the zram advantages: + +```ini +# /etc/sysctl.d/99-vm-zram-parameters.conf + +vm.swappiness = 180 +vm.watermark_boost_factor = 0 +vm.watermark_scale_factor = 125 +vm.page-cluster = 0 +``` + +### Enabling a backing device for a zram block +zram can be configured to push incompressible pages to a specified block device when under memory pressure. + +To add a backing device manually: + +```sh +echo /dev/sdX > /sys/block/zram0/backing_dev +``` + +To add a backing device to your zram block device using `zram-generator`, update `/etc/systemd/zram-generator.conf` with the following under your `[zramX]` device you want the backing device added to: + +```ini +# /etc/systemd/zram-generator.conf + +writeback-device=/dev/disk/by-partuuid/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX +``` + +### Using zram for non-swap purposes +zram can also be used as a generic RAM-backed block device, e.g. a `/dev/ram` with less physical memory usage, but slightly lower performance. However there are some caveats: +- There is no partition table support (no automatic creation of `/dev/zramxpy`). +- The block size is fixed to 4 kiB. + +The obvious way around this is to stack a loop device on-top the zram, using [losetup](../applications/cli/system/losetup.md), specifying the desired block size using the `-b` option and the `-P` option to process partition tables and automatic creation of the partition loop devices. + +```sh +zramctl -f -s G +``` + +Copy the disk image to the new `/dev/zramx`, then create a loop device. If the disk image has a partition table, the block size of the loop device must match the block size used by the partition table, which is typically 512 or 4096 bytes. + +```sh +losetup -f -b 512 -P /dev/zramx + +mount /dev/loop0p1 /mnt/boot +mount /dev/loop0p2 /mnt/root +``` From 012c4a1cde3fb422c3746493941f90dde51f62eb Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 23 Dec 2024 09:17:58 +0100 Subject: [PATCH 27/99] update ufw --- technology/applications/network/ufw.md | 125 ++++++++++++++++++++++++- 1 file changed, 121 insertions(+), 4 deletions(-) diff --git a/technology/applications/network/ufw.md b/technology/applications/network/ufw.md index a8b8019..cb81b85 100644 --- a/technology/applications/network/ufw.md +++ b/technology/applications/network/ufw.md @@ -1,5 +1,7 @@ --- obj: application +repo: https://git.launchpad.net/ufw/ +arch-wiki: https://wiki.archlinux.org/title/Uncomplicated_Firewall --- # ufw @@ -17,19 +19,134 @@ The next line is only needed _once_ the first time you install the package: ufw enable ``` -See status: +**See status:** ```shell ufw status ``` -Enable/Disable +**Enable/Disable:** ```shell ufw enable ufw disable ``` -Allow/Deny ports +**Allow/Deny:** ```shell ufw allow ufw deny -``` \ No newline at end of file + +ufw allow from +ufw deny from +``` + +## Forward policy +Users needing to run a VPN such as OpenVPN or WireGuard can adjust the `DEFAULT_FORWARD_POLICY` variable in `/etc/default/ufw` from a value of `DROP` to `ACCEPT` to forward all packets regardless of the settings of the user interface. To forward for a specific interface like `wg0`, user can add the following line in the filter block + +```sh +# /etc/ufw/before.rules + +-A ufw-before-forward -i wg0 -j ACCEPT +-A ufw-before-forward -o wg0 -j ACCEPT +``` + +You may also need to uncomment + +```sh +# /etc/ufw/sysctl.conf + +net/ipv4/ip_forward=1 +net/ipv6/conf/default/forwarding=1 +net/ipv6/conf/all/forwarding=1 +``` + +## Adding other applications +The PKG comes with some defaults based on the default ports of many common daemons and programs. Inspect the options by looking in the `/etc/ufw/applications.d` directory or by listing them in the program itself: + +```sh +ufw app list +``` + +If users are running any of the applications on a non-standard port, it is recommended to simply make `/etc/ufw/applications.d/custom` containing the needed data using the defaults as a guide. + +> **Warning**: If users modify any of the PKG provided rule sets, these will be overwritten the first time the ufw package is updated. This is why custom app definitions need to reside in a non-PKG file as recommended above! + +Example, deluge with custom tcp ports that range from 20202-20205: + +```ini +[Deluge-my] +title=Deluge +description=Deluge BitTorrent client +ports=20202:20205/tcp +``` + +Should you require to define both tcp and udp ports for the same application, simply separate them with a pipe as shown: this app opens tcp ports 10000-10002 and udp port 10003: + +```ini +ports=10000:10002/tcp|10003/udp +``` + +One can also use a comma to define ports if a range is not desired. This example opens tcp ports 10000-10002 (inclusive) and udp ports 10003 and 10009 + +```ini +ports=10000:10002/tcp|10003,10009/udp +``` + +## Deleting applications +Drawing on the Deluge/Deluge-my example above, the following will remove the standard Deluge rules and replace them with the Deluge-my rules from the above example: + +```sh +ufw delete allow Deluge +ufw allow Deluge-my +``` + +## Black listing IP addresses +It might be desirable to add ip addresses to a blacklist which is easily achieved simply by editing `/etc/ufw/before.rules` and inserting an `iptables DROP` line at the bottom of the file right above the "COMMIT" word. + +```sh +# /etc/ufw/before.rules + +... +## blacklist section +# block just 199.115.117.99 +-A ufw-before-input -s 199.115.117.99 -j DROP +# block 184.105.*.* +-A ufw-before-input -s 184.105.0.0/16 -j DROP + +# don't delete the 'COMMIT' line or these rules won't be processed +COMMIT +``` + +## Rate limiting with ufw +ufw has the ability to deny connections from an IP address that has attempted to initiate 6 or more connections in the last 30 seconds. Users should consider using this option for services such as SSH. + +Using the above basic configuration, to enable rate limiting we would simply replace the allow parameter with the limit parameter. The new rule will then replace the previous. + +```sh +ufw limit SSH +``` + +## Disable remote ping +Change `ACCEPT` to `DROP` in the following lines: + +```sh +/etc/ufw/before.rules + +# ok icmp codes +... +-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT +``` + +If you use IPv6, related rules are in `/etc/ufw/before6.rules`. + +## Disable UFW logging +Disabling logging may be useful to stop UFW filling up the kernel (dmesg) and message logs: + +```sh +ufw logging off +``` + +## UFW and Docker +Docker in standard mode writes its own iptables rules and ignores ufw ones, which could lead to security issues. A solution can be found at https://github.com/chaifeng/ufw-docker. + +## GUI frontends +If you are using KDE Plasma, you can just go to `Wi-Fi & Networking > Firewall` to access and adjust firewall configurations given `plasma-firewall` is installed. From 0167d523256e33cb33fc124d2ee402e7c7a553e1 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 23 Dec 2024 10:48:51 +0100 Subject: [PATCH 28/99] update systemd-boot --- technology/linux/systemd/systemd-boot.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/technology/linux/systemd/systemd-boot.md b/technology/linux/systemd/systemd-boot.md index 9b54efa..aac4d52 100644 --- a/technology/linux/systemd/systemd-boot.md +++ b/technology/linux/systemd/systemd-boot.md @@ -10,16 +10,29 @@ systemd-boot is a simple UEFI boot manager which executes configured EFI images. It is simple to configure but can only start EFI executables such as the [Linux](../Linux.md) kernel EFISTUB, UEFI shell, GRUB, or the [Windows](../../windows/Windows.md) Boot Manager. ## Install -Install: +**Install**: ```shell -bootctl install +bootctl install [--esp-path=PATH] ``` -Update: +**Update**: ```shell bootctl update ``` +**Update seed file:** +```shell +bootctl random-seed +``` + +**See status:** +```shell +bootctl status + +# List entries +bootctl list +``` + ## Configuration The loader configuration is stored in the file `_esp_/loader/loader.conf`. From bb16b3fceb277bc4fdb4a7ca8de7a653f4eeac39 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 23 Dec 2024 11:08:19 +0100 Subject: [PATCH 29/99] update --- technology/applications/network/NetworkManager.md | 2 ++ technology/linux/systemd/Systemd-Mounts.md | 4 ++-- technology/linux/systemd/Systemd-Timers.md | 14 +++++++------- technology/linux/systemd/Systemd.md | 9 +++++++-- technology/linux/systemd/hostnamectl.md | 6 ++++++ technology/linux/systemd/journalctl.md | 6 ++++++ technology/linux/systemd/localectl.md | 7 +++++++ technology/linux/systemd/loginctl.md | 6 ++++++ technology/linux/systemd/networkctl.md | 6 ++++++ technology/linux/systemd/systemd-analyze.md | 6 ++++++ technology/linux/systemd/systemd-ask-pass.md | 6 ++++++ technology/linux/systemd/systemd-detect-virt.md | 6 ++++++ technology/linux/systemd/systemd-firstboot.md | 6 ++++++ technology/linux/systemd/systemd-inhibit.md | 6 ++++++ technology/linux/systemd/systemd-resolve.md | 6 ++++++ technology/linux/systemd/systemd-timesyncd.md | 9 +++++++++ technology/linux/systemd/userdbctl.md | 6 ++++++ 17 files changed, 100 insertions(+), 11 deletions(-) create mode 100644 technology/linux/systemd/hostnamectl.md create mode 100644 technology/linux/systemd/journalctl.md create mode 100644 technology/linux/systemd/localectl.md create mode 100644 technology/linux/systemd/loginctl.md create mode 100644 technology/linux/systemd/networkctl.md create mode 100644 technology/linux/systemd/systemd-analyze.md create mode 100644 technology/linux/systemd/systemd-ask-pass.md create mode 100644 technology/linux/systemd/systemd-detect-virt.md create mode 100644 technology/linux/systemd/systemd-firstboot.md create mode 100644 technology/linux/systemd/systemd-inhibit.md create mode 100644 technology/linux/systemd/systemd-resolve.md create mode 100644 technology/linux/systemd/systemd-timesyncd.md create mode 100644 technology/linux/systemd/userdbctl.md diff --git a/technology/applications/network/NetworkManager.md b/technology/applications/network/NetworkManager.md index 44ed17c..7e20ae4 100644 --- a/technology/applications/network/NetworkManager.md +++ b/technology/applications/network/NetworkManager.md @@ -2,6 +2,8 @@ obj: application --- +#refactor + # NetworkManager [NetworkManager](https://networkmanager.dev/) is a program for providing detection and configuration for systems to automatically connect to networks. NetworkManager's functionality can be useful for both wireless and wired networks. For wireless networks, NetworkManager prefers known wireless networks and has the ability to switch to the most reliable network. NetworkManager-aware applications can switch from online and offline mode. NetworkManager also prefers wired connections over wireless ones, has support for modem connections and certain types of VPN. NetworkManager was originally developed by Red Hat and now is hosted by the GNOME project. diff --git a/technology/linux/systemd/Systemd-Mounts.md b/technology/linux/systemd/Systemd-Mounts.md index c645e8d..7ea58e4 100644 --- a/technology/linux/systemd/Systemd-Mounts.md +++ b/technology/linux/systemd/Systemd-Mounts.md @@ -14,7 +14,7 @@ Fields inside the mount section: - `Options` : Mount options to use when mounting. This takes a comma-separated list of options. This setting is optional. ## Example -``` +```ini [Unit] Documentation=man:fstab(5) man:systemd-fstab-generator(8) SourcePath=/etc/fstab @@ -24,4 +24,4 @@ What=/dev/sda1 Where=/mnt Type=btrfs Options=nosuid,nodev,nofail,compress=zstd,ro -``` \ No newline at end of file +``` diff --git a/technology/linux/systemd/Systemd-Timers.md b/technology/linux/systemd/Systemd-Timers.md index 5b1b1f7..55a0d60 100644 --- a/technology/linux/systemd/Systemd-Timers.md +++ b/technology/linux/systemd/Systemd-Timers.md @@ -18,11 +18,11 @@ systemctl list-timers ## Examples ### Monotonic timer - A timer which will start 15 minutes after boot and again every week while the system is running. -`/etc/systemd/system/foo.timer` -``` +```ini +# /etc/systemd/system/foo.timer + [Unit] Description=Run foo weekly and on boot @@ -35,11 +35,11 @@ WantedBy=timers.target ``` ### Realtime timer - A timer which starts once a week (at 12:00am on Monday). When activated, it triggers the service immediately if it missed the last start time (option `Persistent=true`), for example due to the system being powered off: -`/etc/systemd/system/foo.timer` -``` +```ini +# /etc/systemd/system/foo.timer + [Unit] Description=Run foo weekly @@ -59,4 +59,4 @@ An asterisk may be used to specify any value and commas may be used to list poss In the below example the service is run the first four days of each month at 12:00 PM, but _only_ if that day is a Monday or a Tuesday. -`OnCalendar=Mon,Tue *-*-01..04 12:00:00` \ No newline at end of file +`OnCalendar=Mon,Tue *-*-01..04 12:00:00` diff --git a/technology/linux/systemd/Systemd.md b/technology/linux/systemd/Systemd.md index c508346..c5251a8 100644 --- a/technology/linux/systemd/Systemd.md +++ b/technology/linux/systemd/Systemd.md @@ -65,6 +65,11 @@ systemctl mask unit systemctl unmask unit ``` +Get a list of overridden unit files: +```shell +systemd-delta +``` + ## Power Management Shut down and reboot the system `systemctl reboot` @@ -98,7 +103,7 @@ There are several different start-up types to consider when writing a custom ser - `Type=idle`: _systemd_ will delay execution of the service binary until all jobs are dispatched. Other than that behavior is very similar to `Type=simple`. #### Example -``` +```ini [Unit] Description=Description After=network.target @@ -149,4 +154,4 @@ Below are the fields the Install section has: Systemd supports other unit types than `.service`. Some include: - [Systemd-Timers](Systemd-Timers.md) -- [Systemd-Mounts](Systemd-Mounts.md) \ No newline at end of file +- [Systemd-Mounts](Systemd-Mounts.md) diff --git a/technology/linux/systemd/hostnamectl.md b/technology/linux/systemd/hostnamectl.md new file mode 100644 index 0000000..56bfaa0 --- /dev/null +++ b/technology/linux/systemd/hostnamectl.md @@ -0,0 +1,6 @@ +--- +obj: application +--- + +# hostnamectl +#wip diff --git a/technology/linux/systemd/journalctl.md b/technology/linux/systemd/journalctl.md new file mode 100644 index 0000000..9e119a7 --- /dev/null +++ b/technology/linux/systemd/journalctl.md @@ -0,0 +1,6 @@ +--- +obj: application +--- + +# journalctl +#wip diff --git a/technology/linux/systemd/localectl.md b/technology/linux/systemd/localectl.md new file mode 100644 index 0000000..77ca526 --- /dev/null +++ b/technology/linux/systemd/localectl.md @@ -0,0 +1,7 @@ +--- +obj: application +--- + +# localectl +#wip +https://man.archlinux.org/man/localectl.1 diff --git a/technology/linux/systemd/loginctl.md b/technology/linux/systemd/loginctl.md new file mode 100644 index 0000000..da735c9 --- /dev/null +++ b/technology/linux/systemd/loginctl.md @@ -0,0 +1,6 @@ +--- +obj: application +--- + +# loginctl +#wip diff --git a/technology/linux/systemd/networkctl.md b/technology/linux/systemd/networkctl.md new file mode 100644 index 0000000..0ddbe1f --- /dev/null +++ b/technology/linux/systemd/networkctl.md @@ -0,0 +1,6 @@ +--- +obj: application +--- + +# networkctl +#wip diff --git a/technology/linux/systemd/systemd-analyze.md b/technology/linux/systemd/systemd-analyze.md new file mode 100644 index 0000000..918ccba --- /dev/null +++ b/technology/linux/systemd/systemd-analyze.md @@ -0,0 +1,6 @@ +--- +obj: application +--- + +# systemd-analyze +#wip diff --git a/technology/linux/systemd/systemd-ask-pass.md b/technology/linux/systemd/systemd-ask-pass.md new file mode 100644 index 0000000..c321193 --- /dev/null +++ b/technology/linux/systemd/systemd-ask-pass.md @@ -0,0 +1,6 @@ +--- +obj: application +--- + +# systemd-ask-pass +#wip diff --git a/technology/linux/systemd/systemd-detect-virt.md b/technology/linux/systemd/systemd-detect-virt.md new file mode 100644 index 0000000..1adb851 --- /dev/null +++ b/technology/linux/systemd/systemd-detect-virt.md @@ -0,0 +1,6 @@ +--- +obj: application +--- + +# systemd-detect-virt +#wip diff --git a/technology/linux/systemd/systemd-firstboot.md b/technology/linux/systemd/systemd-firstboot.md new file mode 100644 index 0000000..8073a62 --- /dev/null +++ b/technology/linux/systemd/systemd-firstboot.md @@ -0,0 +1,6 @@ +--- +obj: application +--- + +# systemd-firstboot +#wip diff --git a/technology/linux/systemd/systemd-inhibit.md b/technology/linux/systemd/systemd-inhibit.md new file mode 100644 index 0000000..d728255 --- /dev/null +++ b/technology/linux/systemd/systemd-inhibit.md @@ -0,0 +1,6 @@ +--- +obj: application +--- + +# systemd-inhibit +#wip diff --git a/technology/linux/systemd/systemd-resolve.md b/technology/linux/systemd/systemd-resolve.md new file mode 100644 index 0000000..5896281 --- /dev/null +++ b/technology/linux/systemd/systemd-resolve.md @@ -0,0 +1,6 @@ +--- +obj: application +--- + +# systemd-resolve +#wip diff --git a/technology/linux/systemd/systemd-timesyncd.md b/technology/linux/systemd/systemd-timesyncd.md new file mode 100644 index 0000000..1578234 --- /dev/null +++ b/technology/linux/systemd/systemd-timesyncd.md @@ -0,0 +1,9 @@ +--- +obj: application +arch-wiki: https://wiki.archlinux.org/title/Systemd-timesyncd +--- + +# systemd-timesyncd +#wip + +timedatectl diff --git a/technology/linux/systemd/userdbctl.md b/technology/linux/systemd/userdbctl.md new file mode 100644 index 0000000..90bbd1e --- /dev/null +++ b/technology/linux/systemd/userdbctl.md @@ -0,0 +1,6 @@ +--- +obj: application +--- + +# userdbctl +#wip From f4ba4007aca465fdea28578357a7975a5ac8959e Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 23 Dec 2024 11:25:13 +0100 Subject: [PATCH 30/99] update --- .../linux/systemd/systemd-detect-virt.md | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/technology/linux/systemd/systemd-detect-virt.md b/technology/linux/systemd/systemd-detect-virt.md index 1adb851..9be0c68 100644 --- a/technology/linux/systemd/systemd-detect-virt.md +++ b/technology/linux/systemd/systemd-detect-virt.md @@ -1,6 +1,52 @@ --- obj: application +rev: 2024-12-23 --- # systemd-detect-virt -#wip +systemd-detect-virt detects execution in a virtualized environment. It identifies the virtualization technology and can distinguish full machine virtualization from container virtualization. systemd-detect-virt exits with a return value of 0 (success) if a virtualization technology is detected, and non-zero (error) otherwise. By default, any type of virtualization is detected, and the options `--container` and `--vm` can be used to limit what types of virtualization are detected. + +When executed without `--quiet` will print a short identifier for the detected virtualization technology. The following technologies are currently identified: + +| **Type** | **ID** | **Product** | +| --------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| vm | `qemu` | QEMU software virtualization, without KVM | +| vm | `kvm` | Linux KVM kernel virtual machine, in combination with QEMU. Not used for other virtualizers using the KVM interfaces, such as Oracle VirtualBox or Amazon EC2 Nitro, see below. | +| vm | `amazon` | Amazon EC2 Nitro using Linux KVM | +| vm | `zvm` | s390 z/VM | +| vm | `vmware` | VMware Workstation or Server, and related products | +| vm | `microsoft` | Hyper-V, also known as Viridian or Windows Server Virtualization | +| vm | `oracle` | Oracle VM VirtualBox (historically marketed by innotek and Sun Microsystems), for legacy and KVM hypervisor | +| vm | `powervm` | IBM PowerVM hypervisor — comes as firmware with some IBM POWER servers | +| vm | `xen` | Xen hypervisor (only domU, not dom0) | +| vm | `bochs` | Bochs Emulator | +| vm | `uml` | User-mode Linux | +| vm | `parallels` | Parallels Desktop, Parallels Server | +| vm | `bhyve` | bhyve, FreeBSD hypervisor | +| vm | `qnx` | QNX hypervisor | +| vm | `acrn` | ACRN hypervisor | +| vm | `apple` | Apple virtualization framework | +| vm | `sre` | LMHS SRE hypervisor | +| vm | `google` | Google Compute Engine | +| container | `openvz` | OpenVZ/Virtuozzo | +| container | `lxc` | Linux container implementation by LXC | +| container | `lxc-libvirt` | Linux container implementation by libvirt | +| container | `systemd-nspawn` | systemd's minimal container implementation, see systemd-nspawn(1) manual page | +| container | `docker` | Docker container manager | +| container | `podman` | Podman container manager | +| container | `rkt` | rkt app container runtime | +| container | `wsl` | Windows Subsystem for Linux | +| container | `proot` | proot userspace chroot/bind mount emulation | +| container | `pouch` | Pouch Container Engine | + +If multiple virtualization solutions are used, only the "innermost" is detected and identified. That means if both machine and container virtualization are used in conjunction, only the latter will be identified (unless `--vm` is passed). + +## Options + +| Option | Description | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `-c, --container` | Only detects container virtualization (i.e. shared kernel virtualization). | +| `-v, --vm` | Only detects hardware virtualization. | +| `-r, --chroot` | Detect whether invoked in a chroot environment. In this mode, no output is written, but the return value indicates whether the process was invoked in a chroot() environment or not. | +| `-q, --quiet` | Suppress output of the virtualization technology identifier. | +| `--list` | Output all currently known and detectable container and VM environments. | From f86008079d815823690e2d2e9f98e72d3554b1c2 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 23 Dec 2024 14:46:40 +0100 Subject: [PATCH 31/99] update systemd-firstboot --- technology/linux/systemd/systemd-firstboot.md | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/technology/linux/systemd/systemd-firstboot.md b/technology/linux/systemd/systemd-firstboot.md index 8073a62..4b70000 100644 --- a/technology/linux/systemd/systemd-firstboot.md +++ b/technology/linux/systemd/systemd-firstboot.md @@ -3,4 +3,43 @@ obj: application --- # systemd-firstboot -#wip +systemd-firstboot allows for setting of basic system settings before or during the first boot of a newly created system. The tool is able of initialize the following system settings: timezone, locale, hostname, the root password, as well as automated generation of a machine ID. + +As systemd-firstboot interacts with the filesystem directly and does not make use of the related systemd services (such as timedatectl, hostnamectl or localectl), it should not be executed on an already running system. + +Settings can be specified non-interactively when externally used on filesystem images, or interactively if executed during the early boot process. + +Usage: `systemd-firstboot [OPTIONS...]` + +## Options + +| Option | Description | +| ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--root=root` | Takes a directory path as an argument. All paths will be prefixed with the given alternate root path, including config search paths. This is useful to operate on a system image mounted to the specified directory instead of the host system itself. | +| `--image=path` | Takes a path to a disk image file or block device node. If specified all operations are applied to file system in the indicated disk image. This is similar to `--root=` but operates on file systems stored in disk images or block devices. The disk image should either contain just a file system or a set of file systems within a GPT partition table. | +| `--locale=LOCALE`, `--locale-messages=LOCALE` | Sets the system locale, more specifically the `LANG=` and `LC_MESSAGES` settings. The argument should be a valid locale identifier, such as `de_DE.UTF-8`. This controls the `locale.conf` configuration file. | +| `--keymap=KEYMAP` | Sets the system keyboard layout. The argument should be a valid keyboard map, such as `de-latin1`. This controls the `KEYMAP` entry in the `vconsole.conf` configuration file. | +| `--timezone=TIMEZONE` | Sets the system time zone. The argument should be a valid time zone identifier, such as `Europe/Berlin`. This controls the `localtime` symlink. | +| `--hostname=HOSTNAME` | Sets the system hostname. The argument should be a hostname, compatible with DNS. This controls the `hostname` configuration file. | +| `--setup-machine-id` | Initialize the system's machine ID to a random ID. This controls the `machine-id` file. This option only works in combination with `--root=` or `--image=`. On a running system, machine-id is written by the manager with help from `systemd-machine-id-commit.service`. | +| `--machine-id=ID` | Set the system's machine ID to the specified value. The same restrictions apply as to `--setup-machine-id`. | +| `--root-password=PASSWORD`, `--root-password-file=PATH`, `--root-password-hashed=HASHED_PASSWORD` | Sets the password of the system's root user. This creates/modifies the `passwd` and `shadow` files. This setting exists in three forms: `--root-password=` accepts the password to set directly on the command line, `--root-password-file=` reads it from a file and `--root-password-hashed=` accepts an already hashed password on the command line. | +| `--root-shell=SHELL` | Sets the shell of the system's root user. This creates/modifies the `passwd` file. | +| `--kernel-command-line=CMDLINE` | Sets the system's kernel command line. This controls the `/etc/kernel/cmdline` file which is used by kernel-install. | +| `--prompt-locale`, `--prompt-keymap`, `--prompt-timezone`, `--prompt-hostname`, `--prompt-root-password`, `--prompt-root-shell` | Prompt the user interactively for a specific basic setting. Note that any explicit configuration settings specified on the command line take precedence, and the user is not prompted for it. | +| `--prompt` | Query the user for locale, keymap, timezone, hostname, root's password, and root's shell. | +| `--copy-locale`, `--copy-keymap`, `--copy-timezone`, `--copy-root-password`, `--copy-root-shell` | Copy a specific basic setting from the host. This only works in combination with `--root=` or `--image=`. | +| `--copy` | Copy locale, keymap, time zone, root password and shell from the host. | +| `--force` | Write configuration even if the relevant files already exist. Without this option, systemd-firstboot doesn't modify or replace existing files. Note that when configuring the root account, even with this option, systemd-firstboot only modifies the entry of the "root" user, leaving other entries in `/etc/passwd` and `/etc/shadow` intact. | +| `--reset` | If specified, all existing files that are configured by systemd-firstboot are removed. Note that the files are removed regardless of whether they'll be configured with a new value or not. This operation ensures that the next boot of the image will be considered a first boot, and systemd-firstboot will prompt again to configure each of the removed files. | +| `--delete-root-password` | Removes the password of the system's root user, enabling login as root without a password unless the root account is locked. Note that this is extremely insecure and hence this option should not be used lightly. | +| `--welcome=` | Takes a boolean argument. By default when prompting the user for configuration options a brief welcome text is shown before the first question is asked. Pass false to this option to turn off the welcome text. | + +## Delete existing settings +If the following files are present, systemd-firstboot will not prompt for the setting they relate to. + +```sh +rm /etc/{machine-id,localtime,hostname,shadow,locale.conf} +``` + +Edit `/etc/passwd` and remove the root account from it, otherwise the root will be treating as configured and systemd-firstboot will not prompt for the root password. From 927a163c7f754c5025b97523e361ccbbaeee3c8f Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 23 Dec 2024 15:22:30 +0100 Subject: [PATCH 32/99] update --- technology/linux/fwupd.md | 9 +++++++++ technology/linux/smartctl.md | 6 ++++++ technology/linux/udev.md | 9 +++++++++ technology/linux/udisks.md | 9 +++++++++ 4 files changed, 33 insertions(+) create mode 100644 technology/linux/fwupd.md create mode 100644 technology/linux/smartctl.md create mode 100644 technology/linux/udev.md create mode 100644 technology/linux/udisks.md diff --git a/technology/linux/fwupd.md b/technology/linux/fwupd.md new file mode 100644 index 0000000..76891b3 --- /dev/null +++ b/technology/linux/fwupd.md @@ -0,0 +1,9 @@ +--- +obj: application +arch-wiki: https://wiki.archlinux.org/title/Fwupd +website: https://fwupd.org +repo: https://github.com/fwupd/fwupd +--- + +# fwupd +#wip diff --git a/technology/linux/smartctl.md b/technology/linux/smartctl.md new file mode 100644 index 0000000..e0c1b65 --- /dev/null +++ b/technology/linux/smartctl.md @@ -0,0 +1,6 @@ +--- +obj: application +--- + +# smartctl +#wip diff --git a/technology/linux/udev.md b/technology/linux/udev.md new file mode 100644 index 0000000..0fb4f83 --- /dev/null +++ b/technology/linux/udev.md @@ -0,0 +1,9 @@ +--- +obj: application +arch-wiki: https://wiki.archlinux.org/title/Udev +--- + +# udev +#wip +udev +udevadm diff --git a/technology/linux/udisks.md b/technology/linux/udisks.md new file mode 100644 index 0000000..fb4e585 --- /dev/null +++ b/technology/linux/udisks.md @@ -0,0 +1,9 @@ +--- +obj: application +arch-wiki: https://wiki.archlinux.org/title/Udisks +website: https://www.freedesktop.org/wiki/Software/udisks +repo: https://github.com/storaged-project/udisks +--- + +# udisks +#wip From 95e46634639c63516d5737e04f2c87512d211ace Mon Sep 17 00:00:00 2001 From: JMARyA Date: Wed, 8 Jan 2025 11:48:29 +0100 Subject: [PATCH 33/99] update pacman --- .../applications/package managers/arch-linux/Pacman.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/technology/applications/package managers/arch-linux/Pacman.md b/technology/applications/package managers/arch-linux/Pacman.md index f6d8985..bbaa46e 100644 --- a/technology/applications/package managers/arch-linux/Pacman.md +++ b/technology/applications/package managers/arch-linux/Pacman.md @@ -1,7 +1,7 @@ --- obj: application arch-wiki: https://wiki.archlinux.org/title/Pacman -rev: 2024-12-19 +rev: 2025-01-08 --- # Pacman @@ -48,6 +48,11 @@ List explicitly installed packages: pacman -Qe ``` +List of packages owning a file/dir: +```shell +pacman -Qo /path/to/file +``` + List orphan packages (installed as dependencies and not required anymore): ```shell pacman -Qdt From c1d6c28dff78582fac7496996f0534a9e03461dc Mon Sep 17 00:00:00 2001 From: JMARyA Date: Wed, 8 Jan 2025 13:11:28 +0100 Subject: [PATCH 34/99] add xdg-user-dirs --- technology/linux/XDG.md | 74 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 technology/linux/XDG.md diff --git a/technology/linux/XDG.md b/technology/linux/XDG.md new file mode 100644 index 0000000..b00eebc --- /dev/null +++ b/technology/linux/XDG.md @@ -0,0 +1,74 @@ +--- +obj: concept +arch-wiki: https://wiki.archlinux.org/title/XDG_user_directories +rev: 2025-01-08 +--- + +# XDG Directories +The XDG User Directories are a standardized way to define and access common user directories in Unix-like operating systems, primarily defined by the XDG Base Directory Specification from the FreeDesktop.org project. + +These directories provide users and applications with predefined paths for storing specific types of files, such as documents, downloads, music, and more. By using these directories, applications can integrate better with the operating system's file structure and provide a consistent experience for users. + +## Creating default directories +Creating a full suite of localized default user directories within the `$HOME` directory can be done automatically by running: + +```sh +xdg-user-dirs-update +``` + +> **Tip**: To force the creation of English-named directories, `LC_ALL=C.UTF-8 xdg-user-dirs-update --force` can be used. + +When executed, it will also automatically: +- Create a local `~/.config/user-dirs.dirs` configuration file: used by applications to find and use home directories specific to an account. +- Create a local `~/.config/user-dirs.locale` configuration file: used to set the language according to the locale in use. + +The user service `xdg-user-dirs-update.service` will also be installed and enabled by default, in order to keep your directories up to date by running this command at the beginning of each login session. + +## Creating custom directories +Both the local `~/.config/user-dirs.dirs` and global `/etc/xdg/user-dirs.defaults` configuration files use the following environmental variable format to point to user directories: `XDG_DIRNAME_DIR="$HOME/directory_name"` An example configuration file may likely look like this (these are all the template directories): + +```sh +# ~/.config/user-dirs.dirs + +XDG_DESKTOP_DIR="$HOME/Desktop" +XDG_DOCUMENTS_DIR="$HOME/Documents" +XDG_DOWNLOAD_DIR="$HOME/Downloads" +XDG_MUSIC_DIR="$HOME/Music" +XDG_PICTURES_DIR="$HOME/Pictures" +XDG_PUBLICSHARE_DIR="$HOME/Public" +XDG_TEMPLATES_DIR="$HOME/Templates" +XDG_VIDEOS_DIR="$HOME/Videos" +``` + +As xdg-user-dirs will source the local configuration file to point to the appropriate user directories, it is therefore possible to specify custom folders. For example, if a custom folder for the `XDG_DOWNLOAD_DIR` variable has named `$HOME/Internet` in `~/.config/user-dirs.dirs` any application that uses this variable will use this directory. + +> **Note**: Like with many configuration files, local settings override global settings. It will also be necessary to create any new custom directories. + +Alternatively, it is also possible to specify custom folders using the command line. For example, the following command will produce the same results as the above configuration file edit: + +```sh +xdg-user-dirs-update --set DOWNLOAD ~/Internet +``` + +## Querying configured directories +Once set, any user directory can be viewed with xdg-user-dirs. For example, the following command will show the location of the Templates directory, which of course corresponds to the `XDG_TEMPLATES_DIR` variable in the local configuration file: + +```sh +xdg-user-dir TEMPLATES +``` + +## Specification +Please read the full specification. This section will attempt to break down the essence of what it tries to achieve. + +Only `XDG_RUNTIME_DIR` is set by default through `pam_systemd`. It is up to the user to explicitly define the other variables according to the specification. + +### User directories +- `XDG_CONFIG_HOME`: Where user-specific configurations should be written (analogous to `/etc`). Should default to `$HOME/.config`. +- `XDG_CACHE_HOME`: Where user-specific non-essential (cached) data should be written (analogous to `/var/cache`). Should default to `$HOME/.cache`. +- `XDG_DATA_HOME`: Where user-specific data files should be written (analogous to `/usr/share`). Should default to `$HOME/.local/share`. +- `XDG_STATE_HOME`: Where user-specific state files should be written (analogous to `/var/lib`). Should default to `$HOME/.local/state`. +- `XDG_RUNTIME_DIR`: Used for non-essential, user-specific data files such as sockets, named pipes, etc. Not required to have a default value; warnings should be issued if not set or equivalents provided. Must be owned by the user with an access mode of `0700`. Filesystem fully featured by standards of OS. Must be on the local filesystem. May be subject to periodic cleanup. Modified every 6 hours or set sticky bit if persistence is desired. Can only exist for the duration of the user's login. Should not store large files as it may be mounted as a tmpfs.`pam_systemd` sets this to `/run/user/$UID`. + +### System directories +- `XDG_DATA_DIRS`: List of directories separated by `:` (analogous to `PATH`). Should default to `/usr/local/share:/usr/share`. +- `XDG_CONFIG_DIRS`: List of directories separated by `:` (analogous to `PATH`). Should default to `/etc/xdg`. From 323d59d281b6ae6ea5fa02d3b1a538f752fc0f9d Mon Sep 17 00:00:00 2001 From: JMARyA Date: Thu, 9 Jan 2025 10:52:16 +0100 Subject: [PATCH 35/99] add bwrap + age --- technology/applications/Applications.md | 4 +- .../applications/utilities/bubblewrap.md | 103 +++++++++++++++ technology/cryptography/age.md | 123 ++++++++++++++++++ 3 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 technology/applications/utilities/bubblewrap.md create mode 100644 technology/cryptography/age.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 010685c..99fa36d 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -1,6 +1,6 @@ --- obj: meta/collection -rev: 2024-12-10 +rev: 2025-01-09 --- # Applications @@ -233,6 +233,7 @@ rev: 2024-12-10 - [yazi](./cli/yazi.md) - [GPG](../cryptography/GPG.md) - [OpenSSL](../cryptography/OpenSSL.md) +- [age](../cryptography/age.md) - [tomb](./cli/tomb.md) - [dysk](./cli/dysk.md) - [pass](./cli/pass.md) @@ -252,6 +253,7 @@ rev: 2024-12-10 - [wine](../windows/Wine.md) - [sbctl](../linux/sbctl.md) - [systemd-cryptenroll](../linux/systemd/systemd-cryptenroll.md) +- [bubblewrap](./utilities/bubblewrap.md) ## Development - [act](./development/act.md) diff --git a/technology/applications/utilities/bubblewrap.md b/technology/applications/utilities/bubblewrap.md new file mode 100644 index 0000000..0d726d9 --- /dev/null +++ b/technology/applications/utilities/bubblewrap.md @@ -0,0 +1,103 @@ +--- +obj: application +repo: https://github.com/containers/bubblewrap +arch-wiki: https://wiki.archlinux.org//title/Bubblewrap +rev: 2025-01-09 +--- + +# Bubblewrap +Bubblewrap is a lightweight sandbox application used by Flatpak and other container tools. It has a small installation footprint and minimal resource requirements. Notable features include support for cgroup/IPC/mount/network/PID/user/UTS namespaces and seccomp filtering. Note that bubblewrap drops all capabilities within a sandbox and that child tasks cannot gain greater privileges than its parent. + +## Configuration +Bubblewrap can be called directly from the command-line and/or within shell scripts as part of a complex wrapper. + +A no-op bubblewrap invocation is as follows: + +```sh +bwrap --dev-bind / / bash +``` + +This will spawn a Bash process which should behave exactly as outside a sandbox in most cases. If a sandboxed program misbehaves, you may want to start from the above no-op invocation, and work your way towards a more secure configuration step-by-step. + +### Desktop entries +Leverage Bubblewrap within desktop entries: +- Bind as read-write the entire host `/` directory to `/` in the sandbox +- Re-bind as read-only the `/var` and `/etc` directories in the sandbox +- Mount a new devtmpfs filesystem to `/dev` in the sandbox +- Create a tmpfs filesystem over the sandboxed `/run` directory +- Disable network access by creating new network namespace + +```ini +[Desktop Entry] +Name=nano Editor +Exec=bwrap --bind / / --dev /dev --tmpfs /run --unshare-net st -e nano -o . %f +Type=Application +MimeType=text/plain; +``` + +> **Note**: `--dev /dev` is required to write to `/dev/pty` + +## Options +Usage: `bwrap [optiosn] [command]` + +| Option | Description | +| ------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--args FD` | Parse nul-separated arguments from the given file descriptor. This option can be used multiple times to parse options from multiple sources. | +| `--argv0 VALUE` | Set `argv[0]` to the value VALUE before running the program | +| `--unshare-user` | Create a new user namespace | +| `--unshare-user-try` | Create a new user namespace if possible else skip it | +| `--unshare-ipc` | Create a new ipc namespace | +| `--unshare-pid` | Create a new pid namespace | +| `--unshare-net` | Create a new network namespace | +| `--unshare-uts` | Create a new uts namespace | +| `--unshare-cgroup` | Create a new cgroup namespace | +| `--unshare-cgroup-try` | Create a new cgroup namespace if possible else skip it | +| `--unshare-all` | Unshare all possible namespaces. Currently equivalent with: `--unshare-user-try --unshare-ipc --unshare-pid --unshare-net --unshare-uts --unshare-cgroup-try` | +| `--share-net` | Retain the network namespace, overriding an earlier `--unshare-all` or `--unshare-net` | +| `--userns FD` | Use an existing user namespace instead of creating a new one. The namespace must fulfil the permission requirements for `setns()`, which generally means that it must be a descendant of the currently active user namespace, owned by the same user. | +| `--disable-userns` | Prevent the process in the sandbox from creating further user namespaces, so that it cannot rearrange the filesystem namespace or do other more complex namespace modification. | +| `--assert-userns-disabled` | Confirm that the process in the sandbox has been prevented from creating further user namespaces, but without taking any particular action to prevent that. For example, this can be combined with --userns to check that the given user namespace has already been set up to prevent the creation of further user namespaces. | +| `--pidns FD` | Use an existing pid namespace instead of creating one. This is often used with `--userns`, because the pid namespace must be owned by the same user namespace that bwrap uses. | +| `--uid UID` | Use a custom user id in the sandbox (requires `--unshare-user`) | +| `--gid GID` | Use a custom group id in the sandbox (requires `--unshare-user`) | +| `--hostname HOSTNAME` | Use a custom hostname in the sandbox (requires `--unshare-uts`) | +| `--chdir DIR` | Change directory to DIR | +| `--setenv VAR VALUE` | Set an environment variable | +| `--unsetenv VAR` | Unset an environment variable | +| `--clearenv` | Unset all environment variables, except for PWD and any that are subsequently set by `--setenv` | +| `--lock-file DEST` | Take a lock on DEST while the sandbox is running. This option can be used multiple times to take locks on multiple files. | +| `--sync-fd FD` | Keep this file descriptor open while the sandbox is running | +| `--perms OCTAL` | This option does nothing on its own, and must be followed by one of the options that it affects. It sets the permissions for the next operation to OCTAL. Subsequent operations are not affected: for example, `--perms 0700 --tmpfs /a --tmpfs /b` will mount `/a` with permissions `0700`, then return to the default permissions for `/b`. Note that `--perms` and `--size` can be combined: `--perms 0700 --size 10485760 --tmpfs /s` will apply permissions as well as a maximum size to the created tmpfs. | +| `--size BYTES` | This option does nothing on its own, and must be followed by `--tmpfs`. It sets the size in bytes for the next tmpfs. For example, `--size 10485760 --tmpfs /tmp` will create a tmpfs at `/tmp` of size 10MiB. Subsequent operations are not affected. | +| `--bind SRC DEST` | Bind mount the host path SRC on DEST | +| `--bind-try SRC DEST` | Equal to `--bind` but ignores non-existent SRC | +| `--dev-bind SRC DEST` | Bind mount the host path SRC on DEST, allowing device access | +| `--dev-bind-try SRC DEST` | Equal to `--dev-bind` but ignores non-existent SRC | +| `--ro-bind SRC DEST` | Bind mount the host path SRC readonly on DEST | +| `--ro-bind-try SRC DEST` | Equal to `--ro-bind` but ignores non-existent SRC | +| `--remount-ro DEST` | Remount the path DEST as readonly. It works only on the specified mount point, without changing any other mount point under the specified path | +| `--overlay-src SRC` | This option does nothing on its own, and must be followed by one of the other overlay options. It specifies a host path from which files should be read if they aren't present in a higher layer. | +| `--overlay RWSRC WORKDIR DEST`, `--tmp-overlay DEST`, `--ro-overlay DEST` | Use overlayfs to mount the host paths specified by `RWSRC` and all immediately preceding `--overlay-src` on `DEST`. `DEST` will contain the union of all the files in all the layers. With `--overlay` all writes will go to `RWSRC`. Reads will come preferentially from `RWSRC`, and then from any `--overlay-src` paths. `WORKDIR` must be an empty directory on the same filesystem as `RWSRC`, and is used internally by the kernel. With `--tmp-overlay` all writes will go to the tmpfs that hosts the sandbox root, in a location not accessible from either the host or the child process. Writes will therefore not be persisted across multiple runs. With `--ro-overlay` the filesystem will be mounted read-only. This option requires at least two `--overlay-src` to precede it. | +| `--proc DEST` | Mount procfs on DEST | +| `--dev DEST` | Mount new devtmpfs on DEST | +| `--tmpfs DEST` | Mount new tmpfs on DEST. If the previous option was `--perms`, it sets the mode of the tmpfs. Otherwise, the tmpfs has mode `0755`. If the previous option was `--size`, it sets the size in bytes of the tmpfs. Otherwise, the tmpfs has the default size. | +| `--mqueue DEST` | Mount new mqueue on DEST | +| `--dir DEST` | Create a directory at DEST. If the directory already exists, its permissions are unmodified, ignoring `--perms` (use `--chmod` if the permissions of an existing directory need to be changed). If the directory is newly created and the previous option was `--perms`, it sets the mode of the directory. Otherwise, newly-created directories have mode `0755`. | +| `--file FD DEST` | Copy from the file descriptor FD to DEST. If the previous option was `--perms`, it sets the mode of the new file. Otherwise, the file has mode `0666` (note that this is not the same as `--bind-data`). | +| `--bind-data FD DEST` | Copy from the file descriptor FD to a file which is bind-mounted on DEST. If the previous option was `--perms`, it sets the mode of the new file. Otherwise, the file has mode `0600` (note that this is not the same as `--file`). | +| `--ro-bind-data FD DEST` | Copy from the file descriptor FD to a file which is bind-mounted read-only on DEST. If the previous option was `--perms`, it sets the mode of the new file. Otherwise, the file has mode `0600` (note that this is not the same as `--file`). | +| `--symlink SRC DEST` | Create a symlink at DEST with target SRC. | +| `--chmod OCTAL PATH` | Set the permissions of PATH, which must already exist, to OCTAL. | +| `--seccomp FD` | Load and use seccomp rules from FD. The rules need to be in the form of a compiled cBPF program, as generated by seccomp_export_bpf. If this option is given more than once, only the last one is used. Use `--add-seccomp-fd` if multiple seccomp programs are needed. | +| `--add-seccomp-fd FD` | Load and use seccomp rules from FD. The rules need to be in the form of a compiled cBPF program, as generated by seccomp_export_bpf. This option can be repeated, in which case all the seccomp programs will be loaded in the order given (note that the kernel will evaluate them in reverse order, so the last program on the bwrap command-line is evaluated first). All of them, except possibly the last, must allow use of the PR_SET_SECCOMP prctl. This option cannot be combined with `--seccomp`. | +| `--exec-label LABEL` | Exec Label from the sandbox. On an SELinux system you can specify the SELinux context for the sandbox process(s). | +| `--file-label LABEL` | File label for temporary sandbox content. On an SELinux system you can specify the SELinux context for the sandbox content. | +| `--block-fd FD` | Block the sandbox on reading from FD until some data is available. | +| `--userns-block-fd FD` | Do not initialize the user namespace but wait on FD until it is ready. This allow external processes (like newuidmap/newgidmap) to setup the user namespace before it is used by the sandbox process. | +| `--info-fd FD` | Write information in JSON format about the sandbox to FD. | +| `--json-status-fd FD` | Multiple JSON documents are written to FD, one per line. | +| `--new-session` | Create a new terminal session for the sandbox (calls `setsid()`). This disconnects the sandbox from the controlling terminal which means the sandbox can't for instance inject input into the terminal. Note: In a general sandbox, if you don't use `--new-session`, it is recommended to use seccomp to disallow the `TIOCSTI` ioctl, otherwise the application can feed keyboard input to the terminal which can e.g. lead to out-of-sandbox command execution. | +| `--die-with-parent` | Ensures child process (COMMAND) dies when bwrap's parent dies. Kills (SIGKILL) all bwrap sandbox processes in sequence from parent to child including COMMAND process when bwrap or bwrap's parent dies. | +| `--as-pid-1` | Do not create a process with PID=1 in the sandbox to reap child processes. | +| `--cap-add CAP` | Add the specified capability CAP, e.g. `CAP_DAC_READ_SEARCH`, when running as privileged user. It accepts the special value `ALL` to add all the permitted caps. | +| `--cap-drop CAP` | Drop the specified capability when running as privileged user. It accepts the special value `ALL` to drop all the caps. By default no caps are left in the sandboxed process. The `--cap-add` and `--cap-drop` options are processed in the order they are specified on the command line. Please be careful to the order they are specified. | diff --git a/technology/cryptography/age.md b/technology/cryptography/age.md new file mode 100644 index 0000000..d8d7a6f --- /dev/null +++ b/technology/cryptography/age.md @@ -0,0 +1,123 @@ +--- +obj: application +repo: https://github.com/FiloSottile/age +source: https://age-encryption.org/v1 +rev: 2025-01-09 +--- + +# age +age is a simple, modern and secure file encryption tool, format, and Go library. + +It features small explicit keys, no config options, and UNIX-style composability. + +```sh +$ age-keygen -o key.txt +Public key: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p +$ PUBLIC_KEY=$(age-keygen -y key.txt) +$ tar cvz ~/data | age -r $PUBLIC_KEY > data.tar.gz.age +$ age --decrypt -i key.txt data.tar.gz.age > data.tar.gz +``` + +## Usage +For the full documentation, read [the age(1) man page](https://filippo.io/age/age.1). + +``` +Usage: + age [--encrypt] (-r RECIPIENT | -R PATH)... [--armor] [-o OUTPUT] [INPUT] + age [--encrypt] --passphrase [--armor] [-o OUTPUT] [INPUT] + age --decrypt [-i PATH]... [-o OUTPUT] [INPUT] + +Options: + -e, --encrypt Encrypt the input to the output. Default if omitted. + -d, --decrypt Decrypt the input to the output. + -o, --output OUTPUT Write the result to the file at path OUTPUT. + -a, --armor Encrypt to a PEM encoded format. + -p, --passphrase Encrypt with a passphrase. + -r, --recipient RECIPIENT Encrypt to the specified RECIPIENT. Can be repeated. + -R, --recipients-file PATH Encrypt to recipients listed at PATH. Can be repeated. + -i, --identity PATH Use the identity file at PATH. Can be repeated. + +INPUT defaults to standard input, and OUTPUT defaults to standard output. +If OUTPUT exists, it will be overwritten. + +RECIPIENT can be an age public key generated by age-keygen ("age1...") +or an SSH public key ("ssh-ed25519 AAAA...", "ssh-rsa AAAA..."). + +Recipient files contain one or more recipients, one per line. Empty lines +and lines starting with "#" are ignored as comments. "-" may be used to +read recipients from standard input. + +Identity files contain one or more secret keys ("AGE-SECRET-KEY-1..."), +one per line, or an SSH key. Empty lines and lines starting with "#" are +ignored as comments. Passphrase encrypted age files can be used as +identity files. Multiple key files can be provided, and any unused ones +will be ignored. "-" may be used to read identities from standard input. + +When --encrypt is specified explicitly, -i can also be used to encrypt to an +identity file symmetrically, instead or in addition to normal recipients. +``` + +### Multiple recipients +Files can be encrypted to multiple recipients by repeating `-r/--recipient`. Every recipient will be able to decrypt the file. + +``` +$ age -o example.jpg.age -r age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p \ + -r age1lggyhqrw2nlhcxprm67z43rta597azn8gknawjehu9d9dl0jq3yqqvfafg example.jpg +``` + +#### Recipient files +Multiple recipients can also be listed one per line in one or more files passed with the `-R/--recipients-file` flag. + +``` +$ cat recipients.txt +# Alice +age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p +# Bob +age1lggyhqrw2nlhcxprm67z43rta597azn8gknawjehu9d9dl0jq3yqqvfafg +$ age -R recipients.txt example.jpg > example.jpg.age +``` + +If the argument to `-R` (or `-i`) is `-`, the file is read from standard input. + +### Passphrases +Files can be encrypted with a passphrase by using `-p/--passphrase`. By default age will automatically generate a secure passphrase. Passphrase protected files are automatically detected at decrypt time. + +``` +$ age -p secrets.txt > secrets.txt.age +Enter passphrase (leave empty to autogenerate a secure one): +Using the autogenerated passphrase "release-response-step-brand-wrap-ankle-pair-unusual-sword-train". +$ age -d secrets.txt.age > secrets.txt +Enter passphrase: +``` + +### Passphrase-protected key files +If an identity file passed to `-i` is a passphrase encrypted age file, it will be automatically decrypted. + +``` +$ age-keygen | age -p > key.age +Public key: age1yhm4gctwfmrpz87tdslm550wrx6m79y9f2hdzt0lndjnehwj0ukqrjpyx5 +Enter passphrase (leave empty to autogenerate a secure one): +Using the autogenerated passphrase "hip-roast-boring-snake-mention-east-wasp-honey-input-actress". +$ age -r age1yhm4gctwfmrpz87tdslm550wrx6m79y9f2hdzt0lndjnehwj0ukqrjpyx5 secrets.txt > secrets.txt.age +$ age -d -i key.age secrets.txt.age > secrets.txt +Enter passphrase for identity file "key.age": +``` + +Passphrase-protected identity files are not necessary for most use cases, where access to the encrypted identity file implies access to the whole system. However, they can be useful if the identity file is stored remotely. + +### SSH keys +As a convenience feature, age also supports encrypting to `ssh-rsa` and `ssh-ed25519` SSH public keys, and decrypting with the respective private key file. (`ssh-agent` is not supported.) + +``` +$ age -R ~/.ssh/id_ed25519.pub example.jpg > example.jpg.age +$ age -d -i ~/.ssh/id_ed25519 example.jpg.age > example.jpg +``` + +Note that SSH key support employs more complex cryptography, and embeds a public key tag in the encrypted file, making it possible to track files that are encrypted to a specific public key. + +#### Encrypting to a GitHub user +Combining SSH key support and `-R`, you can easily encrypt a file to the SSH keys listed on a GitHub profile. + +``` +$ curl https://github.com/benjojo.keys | age -R - example.jpg > example.jpg.age +``` From 28933b6af81d01e6fb0b96cd682e015e8a34b05e Mon Sep 17 00:00:00 2001 From: JMARyA Date: Tue, 28 Jan 2025 10:31:34 +0100 Subject: [PATCH 36/99] update --- technology/applications/cli/intermodal.md | 57 +++++++++++++++----- technology/dev/programming/languages/Dart.md | 4 +- 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/technology/applications/cli/intermodal.md b/technology/applications/cli/intermodal.md index 8230bb5..d322d70 100644 --- a/technology/applications/cli/intermodal.md +++ b/technology/applications/cli/intermodal.md @@ -1,38 +1,71 @@ --- obj: application repo: https://github.com/casey/intermodal +website: imdl.io +rev: 2025-01-28 --- # Intermodal -[Repo](https://github.com/casey/intermodal) Intermodal is a user-friendly and featureful command-line [BitTorrent](../../internet/BitTorrent.md) metainfo utility. The binary is called `imdl` and runs on [Linux](../../linux/Linux.md), [Windows](../../windows/Windows.md), and [macOS](../../macos/macOS.md). ## Usage ### Create torrent file: ```shell -imdl torrent create file +imdl torrent create [OPTIONS] ``` -Flags: -```shell --N, --name Set name of torrent --i, --input Torrent Files --c, --comment Torrent Comment --a, --announce Torrent Tracker -``` +| Option | Description | +| -------------------------------- | ----------------------------------------------------------------------------------------------------------- | +| `-F, --follow-symlinks` | Follow symlinks in torrent input (default: no) | +| `-f, --force` | Overwrite destination `.torrent` file if it exists | +| `--ignore` | Skip files listed in `.gitignore`, `.ignore`, `.git/info/exclude`, and `git config --get core.excludesFile` | +| `-h, --include-hidden` | Include hidden files that would otherwise be skipped | +| `-j, --include-junk` | Include junk files that would otherwise be skipped | +| `-M, --md5` | Include MD5 checksum of each file in the torrent ( warning: MD5 is broken) | +| `--no-created-by` | Do not populate `created by` key with imdl version information | +| `--no-creation-date` | Do not populate `creation date` key with current time | +| `-O, --open` | Open `.torrent` file after creation (uses platform-specific opener) | +| `--link` | Print created torrent `magnet:` URL to standard output | +| `-P, --private` | Set private flag, restricting peer discovery | +| `-S, --show` | Display information about the created torrent file | +| `-V, --version` | Print version number | +| `-A, --allow ` | Allow specific lint (e.g., `small-piece-length`, `private-trackerless`) | +| `-a, --announce ` | Use primary tracker announce URL for the torrent | +| `-t, --announce-tier ` | Add tiered tracker announce URLs to the torrent metadata, separate their announce URLs with commas. | +| `-c, --comment ` | Set comment text in the generated `.torrent` file | +| `--node ` | Add DHT bootstrap node to the torrent for peer discovery | +| `-g, --glob ` | Include or exclude files matching specific glob patterns | +| `-i, --input ` | Read contents from input source (file, dir, or standard input) | +| `-N, --name ` | Set name of the encoded magnet link to specific text | +| `-o, --output ` | Save `.torrent` file to specified target or print to output | +| `--peer ` | Add peer specification to the generated magnet link | +| `-p, --piece-length ` | Set piece length for encoding torrent metadata | +| `--sort-by ` | Determine order of files within the encoded torrent (path, size, or both) | +| `-s, --source ` | Set source field in encoded torrent metadata to specific text | +| `--update-url ` | Set URL where revised version of metainfo can be downloaded | ### Show torrent information ```shell imdl torrent show ``` +You can output the information as JSON using `--json`. + ### Verify torrent ```shell imdl torrent verify imdl torrent verify --input torr.torrent --content file ``` -### Generate magnet link +### Magnet Links ```shell -imdl torrent link -``` \ No newline at end of file +# Get magnet link from torrent file +imdl torrent link [-s, --select-only ...] +# Select files to download. Values are indices into the `info.files` list, e.g. `--select-only 1,2,3`. + +# Get torrent file from magnet link +imdl torrent from-link [-o, --output ] + +# Announce a torrent +imdl torrent announce +``` diff --git a/technology/dev/programming/languages/Dart.md b/technology/dev/programming/languages/Dart.md index 45d9586..2a3a183 100644 --- a/technology/dev/programming/languages/Dart.md +++ b/technology/dev/programming/languages/Dart.md @@ -401,11 +401,11 @@ You've seen most of the remaining operators in other examples: ### Comments Dart supports single-line comments, multi-line comments, and documentation comments. -####Single-line comments +#### Single-line comments A single-line comment begins with `//`. Everything between `//` and the end of line is ignored by the Dart compiler. ```dart void main() { - // TODO: refactor into an AbstractLlamaGreetingFactory? + // refactor into an AbstractLlamaGreetingFactory? print('Welcome to my Llama farm!'); } ``` From ee55a0b016eb5c08fa18279f1ed25b7d2ee9a7a0 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Thu, 30 Jan 2025 16:17:23 +0100 Subject: [PATCH 37/99] update --- technology/applications/Applications.md | 13 +- technology/applications/cli/kondo.md | 29 ++ technology/applications/cli/mhost.md | 122 +++++ technology/applications/cli/names.md | 17 + technology/applications/cli/qrtool.md | 31 ++ technology/applications/cli/refold.md | 23 + technology/applications/cli/rexturl.md | 45 ++ technology/applications/cli/tagctl.md | 54 +++ technology/applications/cli/unionfarm.md | 54 +++ technology/applications/cli/xt.md | 22 + .../applications/utilities/retry-cli.md | 19 + technology/applications/web/bitmagnet.md | 457 ++++++++++++++++++ 12 files changed, 885 insertions(+), 1 deletion(-) create mode 100644 technology/applications/cli/kondo.md create mode 100644 technology/applications/cli/mhost.md create mode 100644 technology/applications/cli/names.md create mode 100644 technology/applications/cli/qrtool.md create mode 100644 technology/applications/cli/refold.md create mode 100644 technology/applications/cli/rexturl.md create mode 100644 technology/applications/cli/tagctl.md create mode 100644 technology/applications/cli/unionfarm.md create mode 100644 technology/applications/cli/xt.md create mode 100644 technology/applications/utilities/retry-cli.md create mode 100644 technology/applications/web/bitmagnet.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 99fa36d..398209b 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -1,6 +1,6 @@ --- obj: meta/collection -rev: 2025-01-09 +rev: 2025-01-30 --- # Applications @@ -105,6 +105,7 @@ rev: 2025-01-09 - [SnapDrop](./network/SnapDrop.md) - [OnionShare](./network/OnionShare.md) - [qBittorrent](./network/qBittorrent.md) +- [bitmagnet](./web/bitmagnet.md) ## Utilities - [Bottles](./utilities/Bottles.md) @@ -239,6 +240,14 @@ rev: 2025-01-09 - [pass](./cli/pass.md) - [ocrs](./cli/ocrs.md) - [stew](./cli/stew.md) +- [names](./cli/names.md) +- [qrtool](./cli/qrtool.md) +- [tagctl](./cli/tagctl.md) +- [unionfarm](./cli/unionfarm.md) +- [xt](./cli/xt.md) +- [refold](./cli/refold.md) +- [rexturl](./cli/rexturl.md) +- [mhost](./cli/mhost.md) ## System - [Core Utils](./cli/system/Core%20Utils.md) @@ -254,6 +263,7 @@ rev: 2025-01-09 - [sbctl](../linux/sbctl.md) - [systemd-cryptenroll](../linux/systemd/systemd-cryptenroll.md) - [bubblewrap](./utilities/bubblewrap.md) +- [retry-cli](./utilities/retry-cli.md) ## Development - [act](./development/act.md) @@ -268,6 +278,7 @@ rev: 2025-01-09 - [Podman](../tools/Podman.md) - [serie](./cli/serie.md) - [usql](./cli/usql.md) +- [kondo](./cli/kondo.md) ## Media - [yt-dlp](./media/yt-dlp.md) diff --git a/technology/applications/cli/kondo.md b/technology/applications/cli/kondo.md new file mode 100644 index 0000000..0bcf5ab --- /dev/null +++ b/technology/applications/cli/kondo.md @@ -0,0 +1,29 @@ +--- +obj: application +repo: https://github.com/tbillington/kondo +rev: 2025-01-28 +--- + +# Kondo 🧹 +Cleans `node_modules`, `target`, `build`, and friends from your projects. + +Excellent if +- 💾 You want to back up your code but don't want to include GBs of dependencies +- 🧑‍🎨 You try out lots of projects but hate how much space they occupy +- ⚡️ You like keeping your disks lean and zippy + +## Usage +Kondo recursively cleans project directories. + +Supported project types: Cargo, Node, Unity, SBT, Haskell Stack, Maven, Unreal Engine, Jupyter Notebook, Python, Jupyter Notebooks, CMake, Composer, Pub, Elixir, Swift, Gradle, and .NET projects. + +Usage: `kondo [OPTIONS] [DIRS]...` + +| Option | Description | +| ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-I, --ignored-dirs ` | Directories to ignore. Will also prevent recursive traversal within | +| `-q, --quiet...` | Quiet mode. Won't output to the terminal. `-qq` prevents all output | +| `-a, --all` | Clean all found projects without confirmation | +| `-L, --follow-symlinks` | Follow symbolic links | +| `-s, --same-filesystem` | Restrict directory traversal to the root filesystem | +| `-o, --older ` | Only directories with a file last modified n units of time ago will be looked at. Ex: 20d. Units are m: minutes, h: hours, d: days, w: weeks, M: months and y: years | diff --git a/technology/applications/cli/mhost.md b/technology/applications/cli/mhost.md new file mode 100644 index 0000000..a070292 --- /dev/null +++ b/technology/applications/cli/mhost.md @@ -0,0 +1,122 @@ +--- +obj: application +repo: https://github.com/lukaspustina/mhost +website: https://mhost.pustina.de +rev: 2025-01-30 +--- + +# mhost +A modern take on the classic host DNS lookup utility including an easy to use and very fast Rust lookup library. + +## Use Cases +### Just lookup an IP address +```shell +$ mhost l github.com +``` + +### Just lookup an IP address, using even more than just your local name servers +```shell +$ mhost server-lists public-dns -o servers.txt +$ mhost --limit 6000 --max-concurrent-servers 1000 --timeout 1 -f servers.txt l www.github.com +``` + +The first command downloads a list of public available name servers that are maintained by the Public DNS community. Usually only a subset of these are reachable, but it still a large set of active name servers. + +The second command uses the name servers list from before and queries all of them concurrently. These settings are very aggressive and highly stresses your internet connection. mhost default settings are set much more cautiously. + +### Just lookup an IP address, using UDP, TCP, DoT, and DoH +```shell +$ mhost -s 1.1.1.1 -s tcp:1.1.1.1 -s tls:1.1.1.1:853,tls_auth_name=cloudflare-dns.com -s https:1.1.1.1:443,tls_auth_name=cloudflare-dns.com,name=Cloudflare -p l github.com +``` + +As already mentioned before, mhost supports DNS queries over UDP, TCP, DNS over TLS (DoT), as well as DNS over HTTPS (DoH). In the above example, mhost uses all four protocols to query Cloudflare’s name servers. + +This command also shows the syntax for name server specification, which in general is `protocol::port,tls_auth_name=hostname,name=human-readable-name`. + +### Discover a domain +Sometimes you want to know which host names and subdomains a domain has. mhost offers a simple command to help you find these. Please mind, that mhost only uses DNS specific discovery methods. If you want even deeper discoveries using Google, Shodan etc. there are other tools available. + +```shell +$ mhost -p d github.com -p +``` + +This command uses the predefined name servers to discover the GitHub domain. The `-s` reduces all discovered names to real subdomains of github.com.. + +### You can go one more step and explore the autonomous systems GitHub uses. In order to discover those, you can use the following commands: + +```shell +$ mhost -p l --all -w github.com +$ mhost -p l --all 140.82.121.0/24 +``` + +### Check your name server configuration +```shell +$ mhost -p c github.com -p +``` + +## Usage +mhost has three main commands: `lookup`, `discover`, and `check`. `lookup` lookups up arbitrary DNS records of a domain name. `discover` tries various methods to discover host names and subdomains of a domain. `check` uses lints to check if all records of a domain name adhere to the DNS RFC. + +### General Options + +| Option | Description | +| ------------------------------------------ | -------------------------------------------------------------------------------------------------- | +| `-use-system-resolv-opt` | Uses options set in `/etc/resolv.conf` | +| `-no-system-nameservers` | Ignores nameservers from `/etc/resolv.conf` | +| `-S, --no-system-lookups` | Ignores system nameservers for lookups | +| `--resolv-conf ` | Uses alternative resolv.conf file | +| `--ndots ` | Sets number of dots to qualify domain name as FQDN [default: 1] | +| `--search-domain ` | Sets the search domain to append if HOSTNAME has less than `ndots` dots | +| `--system-nameserver ...` | Adds system nameserver for system lookups; only IP addresses allowed | +| `-s, --nameserver ...` | Adds nameserver for lookups | +| `-p, --predefined` | Adds predefined nameservers for lookups | +| `--predefined-filter ` | Filters predefined nameservers by protocol [default: udp] [possible values: udp, tcp, https, tls] | +| `--list-predefined` | Lists all predefined nameservers | +| `-f, --nameservers-from-file ` | Adds nameservers from file | +| `--limit ` | Sets max. number of nameservers to query [default: 100] | +| `--max-concurrent-servers ` | Sets max. concurrent nameservers [default: 10] | +| `--max-concurrent-requests ` | Sets max. concurrent requests per nameserver [default: 5] | +| `--retries ` | Sets number of retries if first lookup to nameserver fails [default: 0] | +| `--timeout ` | Sets timeout in seconds for responses [default: 5] | +| `-m, --resolvers-mode ` | Sets resolvers lookup mode [default: multi] [possible values: multi, uni] | +| `--wait-multiple-responses` | Waits until timeout for additional responses from nameservers | +| `--no-abort-on-error` | Sets do-not-ignore errors from nameservers | +| `--no-abort-on-timeout` | Sets do-not-ignore timeouts from nameservers | +| `--no-aborts` | Sets do-not-ignore errors and timeouts from nameservers | +| `-o, --output ` | Sets the output format for result presentation [default: summary] [possible values: json, summary] | +| `--output-options ` | Sets output options | +| `--show-errors` | Shows error counts | +| `-q, --quiet` | Does not print anything but results | +| `--no-color` | Disables colorful output | +| `--ascii` | Uses only ASCII compatible characters for output | + +### Lookup Options + +| Option | Description | +| -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--all` | Enables lookups for all record types | +| `-s`, `--service` | Parses ARG as service spec and set record type to SRV | +| `-w`, `--whois` | Retrieves Whois information about A, AAAA, and PTR records | +| `-h`, `--help` | Prints help information | +| `-t`, `--record-type ...` | Sets record type to lookup, will be ignored in case of IP address lookup [default: A,AAAA,CNAME,MX] [possible values: A, AAAA, ANAME, ANY, CNAME, MX, NULL, NS, PTR, SOA, SRV, TXT] | + +### Discover Options + +```markdown +| Option | Description | +| ----------------------------------- | ------------------------------------------------------------------------------------------ | +| `-p`, `--show-partial-results` | Shows results after each lookup step | +| `-w`, `--wordlist-from-file ` | Uses wordlist from file | +| `--rnd-names-number ` | Sets number of random domain names to generate for wildcard resolution check [default: 3] | +| `--rnd-names-len ` | Sets length of random domain names to generate for wildcard resolution check [default: 32] | +| `-s`, `--subdomains-only` | Shows subdomains only omitting all other discovered names | + +### Check Options + +| Option | Description | +| ----------------------------- | ------------------------------------------- | +| `--show-partial-results` | Shows results after each check step | +| `--show-intermediate-lookups` | Shows all lookups made during by all checks | +| `--no-cnames` | Does not run cname lints | +| `--no-soa` | Does not run SOA check | +| `--no-spf` | Does not run SPF check | diff --git a/technology/applications/cli/names.md b/technology/applications/cli/names.md new file mode 100644 index 0000000..9270ae2 --- /dev/null +++ b/technology/applications/cli/names.md @@ -0,0 +1,17 @@ +--- +obj: application +repo: https://github.com/fnichol/names +rev: 2025-01-28 +--- + +# names +Random name generator for Rust + +## Usage + +``` +> names +selfish-change +``` + +Usage: `names [-n, --number] ` diff --git a/technology/applications/cli/qrtool.md b/technology/applications/cli/qrtool.md new file mode 100644 index 0000000..3ed9b6f --- /dev/null +++ b/technology/applications/cli/qrtool.md @@ -0,0 +1,31 @@ +--- +obj: application +repo: https://github.com/sorairolake/qrtool +rev: 2025-01-30 +--- + +# qrtool +qrtool is a command-line utility for encoding or decoding QR code. + +## Usage +### Encode +Usage: `qrtool encode [OPTION]…​ [STRING]` + +| Option | Description | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-o, --output FILE` | Output the result to a file. | +| `-r, --read-from FILE` | Read input data from a file. This option conflicts with `[STRING]`. | +| `-s, --size NUMBER` | The module size in pixels. If this option is not specified, the module size is 8 when the output format is PNG or SVG, and 1 otherwise. | +| `-l, --error-correction-level LEVEL` | Error correction level. The possible values are: Level `L`. 7% of codewords can be restored. Level `M`. 15% of codewords can be restored. This is the default value. Level `Q`. 25% of codewords can be restored. Level `H`. 30% of codewords can be restored. | +| `--level LEVEL` | Alias for `-l, --error-correction-level`. | +| `-m, --margin NUMBER` | The width of margin. If this option is not specified, the margin will be 4 for normal QR code and 2 for Micro QR code. | +| `-t, --type FORMAT` | The format of the output. The possible values are: `png`, `svg`, `pic`, `ansi256`, `ansi-true-color`, `ascii`, `ascii-invert`, `unicode`, `unicode-invert` | +| `--foreground COLOR` | Foreground color. COLOR takes a CSS color string. Colored output is only available when the output format is PNG, SVG or any ANSI escape sequences. Note that lossy conversion may be performed depending on the color space supported by the method to specify a color, the color depth supported by the output format, etc. Default is black. | +| `--background COLOR` | Background color. COLOR takes a CSS color string. Colored output is only available when the output format is PNG, SVG or any ANSI escape sequences. Note that lossy conversion may be performed depending on the color space supported by the method to specify a color, the color depth supported by the output format, etc. Default is white. | + +### Decode +Usage: `qrtool decode [OPTION]…​ [IMAGE]` + +| Option | Description | +| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-t, --type FORMAT` | The format of the input. If FORMAT is not specified, the format is determined based on the extension or the magic number. The possible values are: `bmp`, `dds`, `farbfeld`, `gif`, `hdr`, `ico`, `jpeg`, `openexr`, `png`, `pnm`, `qoi`, `svg`, `tga`, `tiff`, `webp`, `xbm` | diff --git a/technology/applications/cli/refold.md b/technology/applications/cli/refold.md new file mode 100644 index 0000000..862ffaa --- /dev/null +++ b/technology/applications/cli/refold.md @@ -0,0 +1,23 @@ +--- +obj: application +repo: https://github.com/wr7/refold +rev: 2025-01-30 +--- + +# refold +refold is a commandline tool for performing text-wrapping, similar to unix `fold`. Unlike `fold`, refold will recombine lines before performing line-wrapping, and it will automatically detect line prefixes. + +## Usage +Usage: `refold [FLAGS...]` + +refold reads from stdin and writes to stdout + +### Options + +| Option | Description | +| ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | +| `--width, -w ` | Sets the width to wrap at (default 80). | +| `--prefix, -p ` | Sets the prefix for each line (default: auto detect). Set to an empty string to disable prefixing entirely. | +| `--boundaries, -b, --unicode-boundaries` | Sets the split mode to "boundaries" mode (default). In boundaries mode, line wrapping may occur in-between unicode breakable characters. | +| `--spaces, -s` | Sets the split mode to "space" mode. In space mode, line wrapping may occur in-between words separated by ASCII spaces. | +| `--characters, -c, --break-words, --break` | Sets the split mode to "character" mode. In character mode, line wrapping may occur in-between any two characters. | diff --git a/technology/applications/cli/rexturl.md b/technology/applications/cli/rexturl.md new file mode 100644 index 0000000..60112a7 --- /dev/null +++ b/technology/applications/cli/rexturl.md @@ -0,0 +1,45 @@ +--- +obj: application +repo: https://github.com/vschwaberow/rexturl +rev: 2025-01-30 +--- + +# rexturl +A versatile command-line tool for parsing and manipulating URLs. + +## Usage +Usage: `rexturl [OPTIONS] [URLS...]` + +If no URLs are provided, rexturl will read from stdin. + +### Options + +| Option | Description | +| ------------------- | --------------------------------------------------------- | +| `--urls ` | Input URLs to process | +| `--scheme` | Extract and display the URL scheme | +| `--username` | Extract and display the username from the URL | +| `--host` | Extract and display the hostname | +| `--port` | Extract and display the port number | +| `--path` | Extract and display the URL path | +| `--query` | Extract and display the query string | +| `--fragment` | Extract and display the URL fragment | +| `--sort` | Sort the output | +| `--unique` | Remove duplicate entries from the output | +| `--json` | Output results in JSON format | +| `--all` | Display all URL components | +| `--custom` | Enable custom output mode | +| `--format ` | Custom output format [default: `{scheme}://{host}{path}`] | +| '--domain' | Extract and display the domain | + + +### Custom Output Format +When using `--custom` and `--format`, you can use the following placeholders: +- `{scheme}` +- `{username}` +- `{host}` +- `{domain}` +- `{port}` +- `{path}` +- `{query}` +- `{fragment}` diff --git a/technology/applications/cli/tagctl.md b/technology/applications/cli/tagctl.md new file mode 100644 index 0000000..d18c7e4 --- /dev/null +++ b/technology/applications/cli/tagctl.md @@ -0,0 +1,54 @@ +--- +obj: application +repo: https://gitlab.com/KodyVB/tagctl +rev: 2025-01-30 +--- + +# tagctl +Tagctl is a command line program which can add or remove tags to files. +The tags can either be in the name or under `user.xdg.tags` in the extended attributes. + +## Usage +Usage: `tagctl [OPTIONS] [FILES]...` + +| Option | Description | +| ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-t, --tag ` | Tag to add/remove to selected files. `%p` uses the parent directory name, `%y` uses the modified year, `%m` uses modified month, `%d` uses modified day, and `%w` uses modified weekday | +| `-d, --delimiter ` | Separator for multiple tags (default: `,`) | +| `-i, --input` | Accepts input from stdin | +| `-x, --xattr` | Adds/removes tags via xattr under `user.xdg.tags` | +| `-r, --remove` | Removes tag instead of adding | +| `-R, --remove_all` | Removes all tags | +| `-v, --verbose` | Increases verbosity of output | +| `-g, --generate_autocomplete ` | The shell to generate auto-completion for `bash`, `elvish`, `fish`, `zsh` | + + +## Examples +**Add tag `example` to current directory using file names:** +```shell +tagctl -t example "$(ls)" +ls | tagctl --input --tag example +``` + +**Remove tag `example` from current directory using file names:** +```shell +tagctl -r --tag=example "$(ls)" +ls | tagctl --remove -it example +``` + +**Add tag `example` to current directory using extended attributes:** +```shell +tagctl -xt example "$(ls)" +ls | tagctl --xattr --input --tag example +``` + +**Remove tag `example` from current directory using extended attributes:** +```shell +tagctl -xr --tag=example "$(ls)" +ls | tagctl --xattr --remove -it example +``` + +**Add tag `example` to two sets of inputs using file names:** +```shell +find /home/user/Documents | tagctl -it "example" "$(ls)" +``` diff --git a/technology/applications/cli/unionfarm.md b/technology/applications/cli/unionfarm.md new file mode 100644 index 0000000..9ec3858 --- /dev/null +++ b/technology/applications/cli/unionfarm.md @@ -0,0 +1,54 @@ +--- +obj: application +repo: https://codeberg.org/chrysn/unionfarm +rev: 2025-01-30 +--- + +# unionfarm +This is a small utility for managing symlink farms. It takes a "farm" directory and any number of "data" directories, and creates (or updates) the union (or overlay) of the data directories in the farm directory by placing symlinks to data directories. + +It is similar to +- union mounts (overlay/overlayfs) -- but works without system privileges; it is not live, but can then again err out on duplicate files rather than picking the highest ranking + +Usage: `unionfarm [DATA]...` + +## Example + +``` +$ tree my-photos +my-photos +├── 2018/ +│ └── Rome/ +│ └── ... +└── 2019/ + └── Helsinki/ + └── DSCN2305.jpg +``` + +Assume you have a collection of photos as above, and want to see them overlaid with a friend's photos: + +``` +$ tree ~friend/photos +/home/friend/photos +├── 2018/ +│ └── Amsterdam/ +│ └── ... +└── 2019/ + └── Helsinki/ + └── DSC_0815.jpg +``` + +With unionfarm, you can create a shared view on them: + +``` +$ unionfarm all-photos my-photos ~friend/photos +$ tree all-photos +all-photos +├── 2018/ +│ ├── Amsterdam -> /home/friend/photos/2018/Amsterdam/ +│ └── Rome -> ../../my-photos/2018/Rome/ +└── 2019/ + └── Helsinki/ + ├── DSC_0815.jpg -> /home/friend/photos/2019/Helsinki/DSC_0815.jpg + └── DSCN2305.jpg -> ../../../my-photos/2019/Helsinki/DSCN2305.jpg +``` diff --git a/technology/applications/cli/xt.md b/technology/applications/cli/xt.md new file mode 100644 index 0000000..f92cc07 --- /dev/null +++ b/technology/applications/cli/xt.md @@ -0,0 +1,22 @@ +--- +obj: application +repo: https://github.com/ahamlinman/xt +rev: 2025-01-30 +--- + +# xt +xt is a cross-format translator for JSON, MessagePack, TOML, and YAML. + +## Usage +Usage: `xt [-f format] [-t format] [file ...]` + +| Option | Description | +|---|---| +| `-f format` | Skip detection and convert every input from the given format | +| `-t format` | Convert to the given format (default: `json`) | + +## Formats +- `json`, `j`: +- `msgpack`, `m` +- `toml`, `t` +- `yaml`, `y` diff --git a/technology/applications/utilities/retry-cli.md b/technology/applications/utilities/retry-cli.md new file mode 100644 index 0000000..7cd9c98 --- /dev/null +++ b/technology/applications/utilities/retry-cli.md @@ -0,0 +1,19 @@ +--- +obj: application +repo: https://github.com/demoray/retry-cli +rev: 2025-01-28 +--- + +# retry-cli +retry is a command line tool written in Rust intended to automatically re-run failed commands with a user configurable delay between tries. + +## Usage +Usage: `retry [OPTIONS] ...` + +| Option | Description | +| ------------------------------- | -------------------------------------------------------------- | +| `--attempts ` | Amount of retries (default: `3`) | +| `--min-duration ` | minimum duration (default: `10ms`) | +| `--max-duration ` | maximum duration | +| `--jitter ` | amount of randomization to add to the backoff (default: `0.3`) | +| `--factor ` | backoff factor (default: `2`) | diff --git a/technology/applications/web/bitmagnet.md b/technology/applications/web/bitmagnet.md new file mode 100644 index 0000000..6787ecb --- /dev/null +++ b/technology/applications/web/bitmagnet.md @@ -0,0 +1,457 @@ +--- +obj: application +website: https://bitmagnet.io +--- + +# bitmagnet +A self-hosted BitTorrent indexer, DHT crawler, content classifier and torrent search engine with web UI, GraphQL API and Servarr stack integration. + +## Docker Compose + +```yml +services: + bitmagnet: + image: ghcr.io/bitmagnet-io/bitmagnet:latest + container_name: bitmagnet + ports: + # API and WebUI port: + - "3333:3333" + # BitTorrent ports: + - "3334:3334/tcp" + - "3334:3334/udp" + restart: unless-stopped + environment: + - POSTGRES_HOST=postgres + - POSTGRES_PASSWORD=postgres + # - TMDB_API_KEY=your_api_key + command: + - worker + - run + - --keys=http_server + - --keys=queue_server + # disable the next line to run without DHT crawler + - --keys=dht_crawler + depends_on: + postgres: + condition: service_healthy + + postgres: + image: postgres:16-alpine + container_name: bitmagnet-postgres + volumes: + - ./data/postgres:/var/lib/postgresql/data + # ports: + # - "5432:5432" Expose this port if you'd like to dig around in the database + restart: unless-stopped + environment: + - POSTGRES_PASSWORD=postgres + - POSTGRES_DB=bitmagnet + - PGUSER=postgres + shm_size: 1g + healthcheck: + test: + - CMD-SHELL + - pg_isready + start_period: 20s + interval: 10s +``` + +After running `docker compose up -d` you should be able to access the web interface at http://localhost:3333. The DHT crawler should have started and you should see items appear in the web UI within around a minute. + +To run the bitmagnet CLI, use `docker compose run bitmagnet bitmagnet command...` + +## Configuration + +- `postgres.host`, `postgres.name`, `postgres.user`, `postgres.password` (default: `localhost`, `bitmagnet`, `postgres`, `empty`): Set these values to configure connection to your Postgres database. +- `tmdb.api_key`: TMDB API Key. +- `tmdb.enabled` (default: `true`): Specify false to disable the TMDB API integration. +- `dht_crawler.save_files_threshold` (default: `100`): Some torrents contain many thousands of files, which impacts performance and uses a lot of database disk space. This parameter sets a maximum limit for the number of files saved by the crawler with each torrent. +- `dht_crawler.save_pieces` (default: `false`): If true, the DHT crawler will save the pieces bytes from the torrent metadata. The pieces take up quite a lot of space, and aren’t currently very useful, but they may be used by future features. +- `log.level` (default: `info`): Logging +- `log.json` (default: `false`): By default logs are output in a pretty format with colors; enable this flag if you’d prefer plain JSON. + +To see a full list of available configuration options using the CLI, run: + +```sh +bitmagnet config show +``` + +### Specifying configuration values +Configuration paths are delimited by dots. If you’re specifying configuration in a YAML file then each dot represents a nesting level, for example to configure `log.json`, `tmdb.api_key` and `http_server.cors.allowed_origins`: + +```yml +log: + json: true +tmdb: + api_key: my-api-key +http_server: + cors: + allowed_origins: + - https://example1.com + - https://example2.com +``` + +This is not a suggested configuration file, it’s just an example of how to specify configuration values. + +To configure these same values with environment variables, upper-case the path and replace all dots with underscores, for example: + +```sh +LOG_JSON=true \ +TMDB_API_KEY=my-api-key \ +HTTP_SERVER_CORS_ALLOWED_ORIGINS=https://example1.com,https://example2.com \ + bitmagnet config show +``` + +### Configuration precedence +In order of precedence, configuration values will be read from: +- Environment variables +- `config.yml` in the current working directory +- `config.yml` in the XDG-compliant config location for the current user (for example on MacOS this is `~/Library/Application Support/bitmagnet/config.yml`) +- Default values + +Environment variables can be used to configure simple scalar types (strings, numbers, booleans) and slice types (arrays). For more complex configuration types such as maps you’ll have to use YAML configuration. bitmagnet will exit with an error if it’s unable to parse a provided configuration value. + +### VPN configuration +It’s recommended that you run bitmagnet behind a VPN. If you’re using Docker then `gluetun` is a good solution for this, although the networking settings can be tricky. + +### Classifier +The classifier can be configured and customized to do things like: +- automatically delete torrents you don’t want in your index +- add custom tags to torrents you’re interested in +- customize the keywords and file extensions used for determining a torrent’s content type +- specify completely custom logic to classify and perform other actions on torrents + +#### Background +After a torrent is crawled or imported, some further processing must be done to gather metadata, have a guess at the torrent’s contents and finally index it in the database, allowing it to be searched and displayed in the UI/API. + +bitmagnet’s classifier is powered by a Domain Specific Language. The aim of this is to provide a high level of customisability, along with transparency into the classification process which will hopefully aid collaboration on improvements to the core classifier logic. + +The classifier is declared in YAML format. The application includes a core classifier that can be configured, extended or completely replaced with a custom classifier. This page documents the required format. + +#### Source precedence +bitmagnet will attempt to load classifier source code from all the following locations. Any discovered classifier source will be merged with other sources in the following order of precedence: + +- the core classifier +- `classifier.yml` in the XDG-compliant config location for the current user (for example on MacOS this is `~/Library/Application Support/bitmagnet/classifier.yml`) +- `classifier.yml` in the current working directory +- Classifier configuration + +Note that multiple sources will be merged, not replaced. For example, keywords added to the classifier configuration will be merged with the core keywords. + +The merged classifier source can be viewed with the CLI command `bitmagnet classifier show`. + +#### Schema +A JSON schema for the classifier is available; some editors and IDEs will be able to validate the structure of your classifier document by specifying the `$schema` attribute: + +```yml +$schema: bitmagnet.io/schemas/classifier-0.1.json +``` + +The classifier schema can also be viewed by running the cli command `bitmagnet classifier schema`. + + +The classifier declaration comprises the following components: +- **Workflows** +A workflow is a list of actions that will be executed on all torrents when they are classified. When no custom configuration is provided, the default workflow will be run. To use a different workflow instead, specify the classifier.workflow configuration option with the name of your custom workflow. + +- **Actions** +An action is a piece of workflow to be executed. All actions either return an updated classification result or an error. +For example, the following action will set the content type of the current torrent to audiobook: + +```yml +set_content_type: audiobook +``` + +The following action will return an unmatched error: +```yml +unmatched +``` + +And the following action will delete the current torrent being classified (returning a delete error): +```yml +delete +``` + +These actions aren’t much use on their own - we’d want to check some conditions are satisfied before setting a content type or deleting a torrent, and for this we’d use the if_else action. For example, the following action will set the content type to audiobook if the torrent name contains audiobook-related keywords, and will otherwise return an unmatched error: +```yml +if_else: + condition: "torrent.baseName.matches(keywords.audiobook)" + if_action: + set_content_type: audiobook + else_action: unmatched +``` + +The following action will delete a torrent if its name matches the list ofbanned keywords: +```yml +if_else: + condition: "torrent.baseName.matches(keywords.banned)" + if_action: delete +``` + +Actions may return the following types of error: +- An unmatched error indicates that the current action did not match for the current torrent +- A delete error indicates that the torrent should be deleted +- An unhandled error may occur, for example if the TMDB API was unreachable + +Whenever an error is returned, the current classification will be terminated. + +Note that a workflow should never return an unmatched error. We expect to iterate through a series of checks corresponding to each content type. If the current torrent does not match the content type being checked, we’ll proceed to the next check until we find a match; if no match can be found, the content type will be unknown. To facilitate this, we can use the find_match action. + +The find_match action is a bit like a try/catch block in some programming languages; it will try to match a particular content type, and if an unmatched error is returned, it will catch the unmatched error proceed to the next check. For example, the following action will attempt to classify a torrent as an audiobook, and then as an ebook. If both checks fail, the content type will be unknown: +```yml +find_match: + # match audiobooks: + - if_else: + condition: "torrent.baseName.matches(keywords.audiobook)" + if_action: + set_content_type: audiobook + else_action: unmatched + # match ebooks: + - if_else: + condition: "torrent.files.map(f, f.extension in extensions.ebook ? f.size : - f.size).sum() > 0" + if_action: + set_content_type: ebook + else_action: unmatched +``` + +For a full list of available actions, please refer to the JSON schema. + +#### Conditions +Conditions are used in conjunction with the `if_else` action, in order to execute an action if a particular condition is satisfied. + +The conditions in the examples above use CEL (Common Expression Language) expressions. + +##### The CEL environment +CEL is already a well-documented language, so this page won’t go into detail about the CEL syntax. In the context of the bitmagnet classifier, the CEL environment exposes a number of variables: + +- `torrent`: The current torrent being classified (protobuf type: `bitmagnet.Torrent`) +- `result`: The current classification result (protobuf type: `bitmagnet.Classification`) +- `keywords`: A map of strings to regular expressions, representing named lists of keywords +- `extensions`: A map of strings to string lists, representing named lists of extensions +- `contentType`: A map of strings to enum values representing content types (e.g. `contentType.movie`, `contentType.music`) +- `fileType`: A map of strings to enum values representing file types (e.g. `fileType.video`, `fileType.audio`) +- `flags`: A map of strings to the configured values of flags +- `kb`, `mb`, `gb`: Variables defined for convenience, equal to the number of bytes in a kilobyte, megabyte and gigabyte respectively + +For more details on the protocol buffer types, please refer to the protobuf schema. + +##### Boolean logic (`or`, `and` & `not`) +In addition to CEL expressions, conditions may be declared using the boolean logic operators or, and and not. For example, the following condition evaluates to true, if either the torrent consists mostly of file extensions very commonly used for music (e.g. `flac`), OR if the torrent both has a name that includes music-related keywords, and consists mostly of audio files: + +or: + - "torrent.files.map(f, f.extension in extensions.music ? f.size : - f.size).sum() > 0" + - and: + - "torrent.baseName.matches(keywords.music)" + - "torrent.files.map(f, f.fileType == fileType.audio ? f.size : - f.size).sum() > 0" + +> Note that we could also have specified the above condition using just one CEL expression, but breaking up complex conditions like this is more readable. + +#### Keywords +The classifier includes lists of keywords associated with different types of torrents. These aim to provide a simpler alternative to regular expressions, and the classifier will compile all keyword lists to regular expressions that can be used within CEL expressions. In order for a keyword to match, it must appear as an isolated token in the test string - that is, it must be either at the beginning or preceded by a non-word character, and either at the end or followed by a non-word character. + +Reserved characters in the syntax are: + +parentheses `(` and `)` enclose a group +`|` is an `OR` operator +`*` is a wildcard operator +`?` makes the previous character or group optional +`+` specifies one or more of the previous character +`#` specifies any number +` ` specifies any non-word or non-number character + +For example, to define some music- and audiobook-related keywords: +```yml +keywords: + music: # define music-related keywords + - music # all letters are case-insensitive, and must be defined in lowercase unless escaped + - discography + - album + - \V.?\A # escaped letters are case-sensitive; matches "VA", "V.A" and "V.A.", but not "va" + - various artists # matches "various artists" and "Various.Artists" + audiobook: # define audiobook-related keywords + - (audio)?books? + - (un)?abridged + - narrated + - novels? + - (auto)?biograph(y|ies) # matches "biography", "autobiographies" etc. +``` + +If you’d rather use plain old regular expressions, the CEL syntax supports that too, for example `torrent.baseName.matches("^myregex$")`. + +#### Extensions +The classifier includes lists of file extensions associated with different types of content. For example, to identify torrents of type comic by their file extensions, the extensions are first declared: + +```yml +extensions: + comic: + - cb7 + - cba + - cbr + - cbt + - cbz +``` + +The extensions can now be used as part of a condition within an `if_else` action: +```yml +if_else: + condition: "torrent.files.map(f, f.extension in extensions.comic ? f.size : - f.size).sum() > 0" + if_action: + set_content_type: comic + else_action: unmatched +``` + +#### Flags +Flags can be used to configure workflows. In order to use a flag in a workflow, it must first be defined. For example, the core classifier defines the following flags that are used in the default workflow: +```yml +flag_definitions: + tmdb_enabled: bool + delete_content_types: content_type_list + delete_xxx: bool +``` + +These flags can be referenced within CEL expressions, for example to delete adult content if the `delete_xxx` flag is set to true: +```yml +if_else: + condition: "flags.delete_xxx && result.contentType == contentType.xxx" + if_action: delete +``` + +#### Configuration +The classifier can be customized by providing a `classifier.yml` file in a supported location as described above. If you only want to make some minor modifications, it may be convenient to specify these using the main application configuration instead, by providing values in either `config.yml` or as environment variables. The application configuration exposes some but not all properties of the classifier. + +For example, in your `config.yml` you could specify: +```yml +classifier: + # specify a custom workflow to be used: + workflow: custom + # add to the core list of music keywords: + keywords: + music: + - my-custom-music-keyword + # add a file extension to the list of audiobook-related extensions: + extensions: + audiobook: + - abc + # auto-delete all comics + flags: + delete_content_types: + - comics +``` + +Or as environment variables you could specify: +```shell +TMDB_ENABLED=false \ # disable the TMDB API integration +CLASSIFIER_WORKFLOW=custom \ # specify a custom workflow to be used +CLASSIFIER_DELETE_XXX=true \ # auto-delete all adult content +bitmagnet worker run --all +``` + +#### Validation +The classifier source is compiled on initial load, and all structural and syntax errors should be caught at compile time. If there are errors in your classifier source, bitmagnet should exit with an error message indicating the location of the problem. + +#### Testing on individual torrents +You can test the classifier on an individual torrent or torrents using the bitmagnet process CLI command: +```shell +bitmagnet process --infoHash=aaaaaaaaaaaaaaaaaaaa --infoHash=bbbbbbbbbbbbbbbbbbbb +``` + +#### Reclassify all torrents +The classifier is being updated regularly, and to reclassify already-crawled torrents you’ll need to run the CLI and queue them for reprocessing. + +For context: after torrents are crawled or imported, they won’t show up in the UI straight away. They must first be “processed” by the job queue. This involves a few steps: +- The classifier attempts to classify the torrent (determine its content type, and match it to a known piece of content) +- The search index for the torrent is built +- The torrent content record is saved to the database + +The reprocess command will re-queue torrents to allow the latest updates to be applied to their content records. + +To reprocess all torrents in your index, simply run `bitmagnet reprocess`. If you’ve indexed a lot of torrents, this will take a while, so there are a few options available to control exactly what gets reprocessed: +- `apisDisabled`: Disable API calls during classification. This makes the classifier run a lot faster, but disables identification with external services such as TMDB (metadata already gathered from external APIs is not lost). +- `contentType`: Only reprocess torrents of a certain content type. For example, `bitmagnet reprocess --contentType movie` will only reprocess movies. Multiple content types can be comma separated, and `null` refers to torrents of unknown content type. +- `orphans`: Only reprocess torrents that have no content record. +- `classifyMode`: This controls how already matched torrents are handled. + - `default`: Only attempt to match previously unmatched torrents + - `rematch`: Ignore any pre-existing match and always classify from scratch (A torrent is “matched” if it’s associated with a specific piece of content from one of the API integrations, currently only TMDB) + +#### Practical use cases and examples +##### Auto-delete specific content types +The default workflow provides a flag that allows for automatically deleting specific content types. For example, to delete all comic, software and xxx torrents: +```yml +flags: + delete_content_types: + - comic + - software + - xxx +``` + +Auto-deleting adult content has been one of the most requested features. For convenience, this is exposed as the configuration option `classifier.delete_xxx`, and can be specified with the environment variable `CLASSIFIER_DELETE_XXX=true`. + +##### Auto-delete torrents containing specific keywords +Any torrents containing keywords in the banned list will be automatically deleted. This is primarily used for deleting CSAM content, but the list can be extended to auto-delete any other keywords: + +```yml +keywords: + banned: + - my-hated-keyword +``` + +##### Disable the TMDB API integration +The `tmdb_enabled` flag can be used to disable the TMDB API integration: +```yml +flags: + tmdb_enabled: false +``` + +For convenience, this is also exposed as the configuration option `tmdb.enabled`, and can be specified with the environment variable `$TMDB_ENABLED=false`. + +The `apis_enabled` flag has the same effect, disabling TMDB and any future API integrations: + +```yml +flags: + apis_enabled: false +``` + +API integrations can also be disabled for individual classifier runs, without disabling them globally, by passing the `--apisDisabled` flag to the reprocess command. + +##### Extend the default workflow with custom logic +Custom workflows can be added in the workflows section of the classifier document. It is possible to extend the default workflow by using the `run_workflow` action within your custom workflow, for example: +```yml +workflows: + custom: + - + - run_workflow: default + - +``` + +A concrete example of this is adding tags to torrents based on custom criteria. + +##### Use tags to create custom torrent categories +Is there a category of torrent you’re interested in that isn’t captured by one of the core content types? Torrent tags are intended to capture custom categories and content types. + +Let’s imagine you’d like to surface torrents containing interesting documents. The interesting documents have specific file extensions, and their filenames contain specific keywords. Let’s create a custom action to tag torrents containing interesting documents: + +```yml +# define file extensions for the documents we're interested in: +extensions: + interesting_documents: + - doc + - docx + - pdf +# define keywords that must be present in the filenames of the interesting documents: +keywords: + interesting_documents: + - interesting + - fascinating +# extend the default workflow with a custom workflow to tag torrents containing interesting documents: +workflows: + custom: + # first run the default workflow: + - run_workflow: default + # then add the tag to any torrents containing interesting documents: + - if_else: + condition: "torrent.files.filter(f, f.extension in extensions.interesting_documents && f.basePath.matches(keywords.interesting_documents)).size() > 0" + if_action: + add_tag: interesting-documents +``` + +To specify that the custom workflow should be used, remember to specify the `classifier.workflow` configuration option, e.g. `CLASSIFIER_WORKFLOW=custom bitmagnet worker run --all`. From 1c7eea08e30fd7295de85a4b3966fef651c00b9b Mon Sep 17 00:00:00 2001 From: JMARyA Date: Fri, 31 Jan 2025 20:10:15 +0100 Subject: [PATCH 38/99] update --- technology/applications/Applications.md | 3 + technology/applications/cli/csvlens.md | 80 +++++++++++++++++++ technology/applications/cli/timr-tui.md | 23 ++++++ .../applications/development/licensit.md | 66 +++++++++++++++ 4 files changed, 172 insertions(+) create mode 100644 technology/applications/cli/csvlens.md create mode 100644 technology/applications/cli/timr-tui.md create mode 100644 technology/applications/development/licensit.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 398209b..5ac52a2 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -199,6 +199,7 @@ rev: 2025-01-30 - [bat](./cli/bat.md) - [glow](./cli/glow.md) - [tailspin](./cli/tailspin.md) +- [csvlens](./cli/csvlens.md) ### Editor - [nano](./cli/nano.md) @@ -248,6 +249,7 @@ rev: 2025-01-30 - [refold](./cli/refold.md) - [rexturl](./cli/rexturl.md) - [mhost](./cli/mhost.md) +- [timr-tui](./cli/timr-tui.md) ## System - [Core Utils](./cli/system/Core%20Utils.md) @@ -279,6 +281,7 @@ rev: 2025-01-30 - [serie](./cli/serie.md) - [usql](./cli/usql.md) - [kondo](./cli/kondo.md) +- [licensit](./development/licensit.md) ## Media - [yt-dlp](./media/yt-dlp.md) diff --git a/technology/applications/cli/csvlens.md b/technology/applications/cli/csvlens.md new file mode 100644 index 0000000..4ebb5be --- /dev/null +++ b/technology/applications/cli/csvlens.md @@ -0,0 +1,80 @@ +--- +obj: application +repo: https://github.com/ys-l/csvlens +rev: 2025-01-31 +--- + +# csvlens +`csvlens` is a command line CSV file viewer. It is like `less` but made +for CSV. + +## Usage +Run `csvlens` by providing the CSV filename: + +``` +csvlens +``` + +Pipe CSV data directly to `csvlens`: + +``` + | csvlens +``` + +### Key bindings + +| Key | Action | +| ---------------------------- | ------------------------------------------------------------------ | +| `hjkl` (or `← ↓ ↑→ `) | Scroll one row or column in the given direction | +| `Ctrl + f` (or `Page Down`) | Scroll one window down | +| `Ctrl + b` (or `Page Up`) | Scroll one window up | +| `Ctrl + d` (or `d`) | Scroll half a window down | +| `Ctrl + u` (or `u`) | Scroll half a window up | +| `Ctrl + h` | Scroll one window left | +| `Ctrl + l` | Scroll one window right | +| `Ctrl + ←` | Scroll left to first column | +| `Ctrl + →` | Scroll right to last column | +| `G` (or `End`) | Go to bottom | +| `g` (or `Home`) | Go to top | +| `G` | Go to line `n` | +| `/` | Find content matching regex and highlight matches | +| `n` (in Find mode) | Jump to next result | +| `N` (in Find mode) | Jump to previous result | +| `&` | Filter rows using regex (show only matches) | +| `*` | Filter columns using regex (show only matches) | +| `TAB` | Toggle between row, column or cell selection modes | +| `>` | Increase selected column's width | +| `<` | Decrease selected column's width | +| `Shift + ↓` (or `Shift + j`) | Sort rows or toggle sort direction by the selected column | +| `#` (in Cell mode) | Find and highlight rows like the selected cell | +| `@` (in Cell mode) | Filter rows like the selected cell | +| `y` | Copy the selected row or cell to clipboard | +| `Enter` (in Cell mode) | Print the selected cell to stdout and exit | +| `-S` | Toggle line wrapping | +| `-W` | Toggle line wrapping by words | +| `r` | Reset to default view (clear all filters and custom column widths) | +| `H` (or `?`) | Display help | +| `q` | Exit | + +### Optional parameters + +* `-d `: Use this delimiter when parsing the CSV + (e.g. `csvlens file.csv -d '\t'`). + + Specify `-d auto` to auto-detect the delimiter. + +* `-t`, `--tab-separated`: Use tab as the delimiter (when specified, `-d` is ignored). + +* `-i`, `--ignore-case`: Ignore case when searching. This flag is ignored if any + uppercase letters are present in the search string. + +* `--no-headers`: Do not interpret the first row as headers. + +* `--columns `: Use this regex to select columns to display by default. + +* `--filter `: Use this regex to filter rows to display by default. + +* `--find `: Use this regex to find and highlight matches by default. + +* `--echo-column `: Print the value of this column at the selected + row to stdout on `Enter` key and then exit. diff --git a/technology/applications/cli/timr-tui.md b/technology/applications/cli/timr-tui.md new file mode 100644 index 0000000..a4d4acc --- /dev/null +++ b/technology/applications/cli/timr-tui.md @@ -0,0 +1,23 @@ +--- +obj: application +repo: https://github.com/sectore/timr-tui +rev: 2025-01-31 +--- + +# timr-tui +TUI to organize your time: Pomodoro, Countdown, Timer. + +## CLI +Usage: `timr-tui [OPTIONS]` + +| Option | Description | +| -------- | ----------------------------------------------------------------------------------------------- | +| `–c` | Countdown time to start from. Formats: 'ss', 'mm:ss', or 'hh:mm:ss' | +| `–w` | Work time to count down from. Formats: 'ss', 'm:ss', or 'h:mm:s' | +| `–p` | Pause time to count down from. Formats: 'ss', 'm:ss', or 'h:m:s' | +| `–d` | Show deciseconds | +| `–m` | Mode to start with. [possible values: countdown, timer, pomodoro] | +| `–s` | Style to display time with. [possible values: full, light, medium, dark, thick, cross, braille] | +| `--menu` | Open the menu | +| `–r` | Reset stored values to default values. | +| `–n` | Toggle desktop notifications on or off. Experimental. [possible values: on, off] | diff --git a/technology/applications/development/licensit.md b/technology/applications/development/licensit.md new file mode 100644 index 0000000..3dab595 --- /dev/null +++ b/technology/applications/development/licensit.md @@ -0,0 +1,66 @@ +--- +obj: application +repo: https://github.com/neuromeow/licensit +rev: 2025-01-31 +--- + +# licensit +`licensit` is a command-line tool to create LICENSE files. + +### Supported licenses + +- GNU Affero General Public License v3.0 (AGPL-3.0) +- Apache License 2.0 (Apache-2.0) +- BSD 2-Clause “Simplified” License (BSD-2-Clause) +- BSD 3-Clause “New” or “Revised” License (BSD-3-Clause) +- Boost Software License 1.0 (BSL-1.0) +- Creative Commons Zero v1.0 Universal (CC0-1.0) +- Eclipse Public License 2.0 (EPL-2.0) +- GNU General Public License v2.0 (GPL-2.0) +- GNU General Public License v3.0 (GPL-3.0) +- GNU Lesser General Public License v2.1 (LGPL-2.1) +- MIT License (MIT) +- Mozilla Public License 2.0 (MPL-2.0) +- The Unlicense (Unlicense) + +## Usage +`licensit` simplifies the process of creating and managing license files for your projects. + +### Listing Available Licenses +``` +licensit list +``` + +Shows all supported licenses. + +### Showing License Content +To view the content of a specific license with the author and year filled in: + +``` +licensit show [LICENSE] [--user USER] [--year YEAR] +``` + +- `[LICENSE]`: The ID of the license you want to display (for example, `mit`, `apache-2.0`) +- `--user [USER]`: Specifies the license holder's name. If not provided, `licensit` will use the following sources in order to determine the user name: + - `LICENSE_AUTHOR` environment variable + - `user.name` entry in the `$HOME/.gitconfig` file + - Username associated with the current effective user ID +- `--year [YEAR]`: Sets the year during which the license is effective. Defaults to the current year if not specified + +To display just the template of a license (without any specific user or year information): + +``` +licensit show [LICENSE] --template +``` + +- `[LICENSE]`: The ID of the license whose template you want to display (for example, `mit`, `apache-2.0`) +- `--template`: Displays the license template with placeholders for the user and year. This option cannot be used with `--user` or `--year` + +### Adding a License to Your Project +To add a license file to your current directory: + +``` +licensit add [LICENSE] [--user USER] [--year YEAR] +``` + +Creates a `LICENSE` file in the current directory with the specified details. From 9dbc181f90837a79d0207c37aebf2289b13d4660 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 7 Apr 2025 16:19:55 +0200 Subject: [PATCH 39/99] update rust crates --- technology/dev/programming/languages/Rust.md | 468 ++++++++++++++++++- 1 file changed, 453 insertions(+), 15 deletions(-) diff --git a/technology/dev/programming/languages/Rust.md b/technology/dev/programming/languages/Rust.md index 4d0e802..108a840 100644 --- a/technology/dev/programming/languages/Rust.md +++ b/technology/dev/programming/languages/Rust.md @@ -941,35 +941,147 @@ The exact assembly code syntax is target-specific and opaque to the compiler exc Currently, all supported targets follow the assembly code syntax used by LLVM's internal assembler which usually corresponds to that of the GNU assembler (GAS). On x86, the .intel_syntax noprefix mode of GAS is used by default. On ARM, the .syntax unified mode is used. These targets impose an additional restriction on the assembly code: any assembler state (e.g. the current section which can be changed with `.section`) must be restored to its original value at the end of the asm string. Assembly code that does not conform to the GAS syntax will result in assembler-specific behavior. Further constraints on the directives used by inline assembly are indicated by Directives Support. ## [Crates](https://lib.rs) -- [itertools](https://lib.rs/crates/itertools): Extra iterator adaptors, iterator methods, free functions, and macros -- [num_enum](https://lib.rs/crates/num_enum): Procedural macros to make inter-operation between primitives and enums easier -- [cached](https://crates.io/crates/cached): Caching Crate +### Filesystem - [tempfile](https://lib.rs/crates/tempfile): Temporary files and directories +- [temp-dir](https://lib.rs/crates/temp-dir): Simple temporary directory with cleanup - [walkdir](https://crates.io/crates/walkdir): recursively scan directories +- [jwalk](https://lib.rs/crates/jwalk): Filesystem walk performed in parallel with streamed and sorted results +- [glob](https://lib.rs/crates/glob): Support for matching file paths against Unix shell style patterns - [notify](https://lib.rs/crates/notify): filesystem watcher +- [camino](https://lib.rs/crates/camino): UTF-8 paths +- [sugar_path](https://lib.rs/crates/sugar_path): Sugar functions for manipulating paths +- [path-absolutize](https://lib.rs/crates/path-absolutize): A library for extending Path and PathBuf in order to get an absolute path and remove the containing dots +- [fs_extra](https://lib.rs/crates/fs_extra): Expanding std::fs and std::io. Recursively copy folders with information about process and much more. +- [vfs](https://lib.rs/crates/vfs): A virtual filesystem for Rust +- [fuser](https://lib.rs/crates/fuser): Filesystem in Userspace (FUSE) for Rust +- [directories](https://lib.rs/crates/directories): A tiny mid-level library that provides platform-specific standard locations of directories for config, cache and other data on Linux, Windows and macOS +- [xattr](https://lib.rs/crates/xattr): unix extended filesystem attributes +- [open](https://lib.rs/crates/open): Open a path or URL using the program configured on the system +- [infer](https://lib.rs/crates/infer): Small crate to infer file type based on magic number signatures ### Error Handling - [anyhow](https://lib.rs/crates/anyhow): Flexible concrete Error type built on `std::error::Error` -- [color-eyre](https://lib.rs/crates/color-eyre): Styled error messages - [thiserror](https://lib.rs/crates/thiserror): macros for creating error types +- [user-error](https://lib.rs/crates/user-error): Pretty printed errors for your CLI application. +- [eyre](https://lib.rs/crates/eyre): Flexible concrete Error Reporting type built on `std::error::Error` with customizable Reports +- [color-eyre](https://lib.rs/crates/color-eyre): An error report handler for panics and `eyre::Reports` for colorful, consistent, and well formatted error reports for all kinds of errors -### Encoding -- [bincode](https://lib.rs/crates/bincode): A binary serialization / deserialization strategy for transforming structs into bytes and vice versa! +### Data Structures +- [hashbrown](https://lib.rs/crates/hashbrown): A Rust port of Google's SwissTable hash map +- [bitvec](https://lib.rs/crates/bitvec): Addresses memory by bits, for packed collections and bitfields +- [bitflags](https://lib.rs/crates/bitflags): A macro to generate structures which behave like bitflags +- [smallvec](https://lib.rs/crates/smallvec): 'Small vector' optimization: store up to a small number of items on the stack +- [ndarray](https://lib.rs/crates/ndarray): An n-dimensional array for general elements and for numerics. Lightweight array views and slicing; views support chunking and splitting. +- [zerovec](https://lib.rs/crates/zerovec): Zero-copy vector backed by a byte array +- [priority-queue](https://lib.rs/crates/priority-queue): A Priority Queue implemented as a heap with a function to efficiently change the priority of an item +- [histogram](https://lib.rs/crates/histogram): A collection of histogram data structures +- [fraction](https://lib.rs/crates/fraction): Lossless fractions and decimals; drop-in float replacement +- [ringbuffer](https://lib.rs/crates/ringbuffer): A fixed-size circular buffer +- [grid](https://lib.rs/crates/grid): Dynamic generic 2D data structure +- [datas](https://lib.rs/crates/datas): A library for data structures and algorithms and data analisys +- [trees](https://lib.rs/crates/trees): General purpose tree data structures +- [either](https://lib.rs/crates/either): The enum Either with variants Left and Right is a general purpose sum type with two cases +- [either_of](https://lib.rs/crates/either_of): Utilities for working with enumerated types that contain one of 2..n other types +- [petgraph](https://lib.rs/crates/petgraph): Graph data structure library. Provides graph types and graph algorithms. +- [hypergraph](https://lib.rs/crates/hypergraph): Hypergraph is data structure library to create a directed hypergraph in which an hyperedge can join any number of vertices +- [gix](https://crates.io/crates/gix): Interact with git repositories just like git would +- [git2](https://lib.rs/crates/git2): Bindings to libgit2 for interoperating with git repositories. + +### Parser +- [nom](https://lib.rs/crates/nom): A byte-oriented, zero-copy, parser combinators library +- [pest](https://lib.rs/crates/pest): pest is a general purpose parser written in Rust +- [keepass](https://lib.rs/crates/keepass): KeePass .kdbx database file parser +- [html5ever](https://lib.rs/crates/html5ever): High-performance browser-grade HTML5 parser +- [comrak](https://lib.rs/crates/comrak): A 100% CommonMark-compatible GitHub Flavored Markdown parser and formatter +- [uriparse](https://lib.rs/crates/uriparse): A URI parser including relative references +- [markdown](https://lib.rs/crates/markdown): CommonMark compliant markdown parser in Rust with ASTs and extensions +- [evalexpr](https://lib.rs/crates/evalexpr): A powerful arithmetic and boolean expression evaluator +- [uuid](https://lib.rs/crates/uuid): A library to generate and parse UUIDs +- [semver](https://lib.rs/crates/semver): Parser and evaluator for Cargo's flavor of Semantic Versioning +- [url](https://lib.rs/crates/url): URL library for Rust, based on the WHATWG URL Standard +- [httparse](https://lib.rs/crates/httparse): A tiny, safe, speedy, zero-copy HTTP/1.x parser +- [syntect](https://lib.rs/crates/syntect): library for high quality syntax highlighting and code intelligence using Sublime Text's grammars + +### Serialization - [serde](https://lib.rs/crates/serde): A generic serialization/deserialization framework +- [serde_with](https://lib.rs/crates/serde_with): Custom de/serialization functions for Rust's serde +- [bincode](https://lib.rs/crates/bincode): A binary serialization / deserialization strategy for transforming structs into bytes and vice versa! - [serde_json](https://lib.rs/crates/serde_json): A [JSON](../../../files/JSON.md) serialization file format +- [serde_jsonc](https://lib.rs/crates/serde_jsonc): A JSON serialization file format - [serde_yaml](https://lib.rs/crates/serde_yaml): [YAML](../../../files/YAML.md) data format for Serde - [bson](https://lib.rs/crates/bson): Encoding and decoding support for [BSON](../../../files/BSON.md) in Rust -- [hex](https://lib.rs/crates/hex): Encoding and decoding data into/from hexadecimal representation - [toml](https://lib.rs/crates/toml): A native Rust encoder and decoder of [TOML](../../../files/TOML.md)-formatted files and streams. +- [gray_matter](https://lib.rs/crates/gray_matter): Smart front matter parser. An implementation of gray-matter in rust. Parses YAML, JSON, TOML and support for custom parsers. +- [schemars](https://lib.rs/crates/schemars): Generate JSON Schemas from Rust code +- [jsonschema](https://lib.rs/crates/jsonschema): JSON schema validaton library +- [json-patch](https://lib.rs/crates/json-patch): RFC 6902, JavaScript Object Notation (JSON) Patch +- [rss](https://lib.rs/crates/rss): Library for serializing the RSS web content syndication format +- [postcard](https://lib.rs/crates/postcard): A no_std + serde compatible message library for Rust + +### Encoding +- [hex](https://lib.rs/crates/hex): Encoding and decoding data into/from hexadecimal representation +- [base62](https://lib.rs/crates/base62): A Base62 encoding/decoding library - [base64](https://lib.rs/crates/base64): encodes and decodes [base64](../../../files/Base64.md) as bytes or utf8 +- [base64-url](https://lib.rs/crates/base64-url): Base64 encode, decode, escape and unescape for URL applications +- [encoding_rs](https://lib.rs/crates/encoding_rs): A Gecko-oriented implementation of the Encoding Standard +- [data-encoding](https://lib.rs/crates/data-encoding): Efficient and customizable data-encoding functions like base64, base32, and hex +- [shell-quote](https://lib.rs/crates/shell-quote): A Rust library for shell-quoting strings, e.g. for interpolating into a Bash script. +- [urlencoding](https://lib.rs/crates/urlencoding): A Rust library for doing URL percentage encoding +- [bytesize](https://lib.rs/crates/bytesize): Semantic wrapper for byte count representations +- [hex-literal](https://lib.rs/crates/hex-literal): Macro for converting hexadecimal string to a byte array at compile time +- [byte-unit](https://lib.rs/crates/byte-unit): A library for interacting with units of bytes +- [bytes](https://lib.rs/crates/bytes): Types and traits for working with bytes ### Algorithms - [rand](https://lib.rs/crates/rand): Random number generators and other randomness functionality +- [bonsai-bt](https://lib.rs/crates/bonsai-bt): Behaviour trees +- [pathfinding](https://lib.rs/crates/pathfinding): Pathfinding, flow, and graph algorithms +- [treediff](https://lib.rs/crates/treediff): Find the difference between arbitrary data structures +- [raft](https://lib.rs/crates/raft): The rust language implementation of Raft algorithm + +### Crypto +- [rustls](https://lib.rs/crates/rustls): Rustls is a modern TLS library written in Rust +- [rustls-pemfile](https://lib.rs/crates/rustls-pemfile): Basic .pem file parser for keys and certificates +- [pem](https://lib.rs/crates/pem): Parse and encode PEM-encoded data +- [x509-parser](https://lib.rs/crates/x509-parser): Parser for the X.509 v3 format (RFC 5280 certificates) +- [openssl](https://lib.rs/crates/openssl): OpenSSL bindings +- [hkdf](https://lib.rs/crates/hkdf): HMAC-based Extract-and-Expand Key Derivation Function (HKDF) +- [ed25519-compact](https://lib.rs/crates/ed25519-compact): A small, self-contained, wasm-friendly Ed25519 implementation +- [snow](https://lib.rs/crates/snow): A pure-rust implementation of the Noise Protocol Framework +- [keyring](https://lib.rs/crates/keyring): Cross-platform library for managing passwords/credentials +- [scrypt](https://lib.rs/crates/scrypt): Scrypt password-based key derivation function +- [totp-rs](https://lib.rs/crates/totp-rs): RFC-compliant TOTP implementation with ease of use as a goal and additionnal QoL features +- [mnemonic](https://lib.rs/crates/mnemonic): Encode any data into a sequence of English words +- [jwt](https://lib.rs/crates/jwt): JSON Web Token library +- [secrets](https://lib.rs/crates/secrets): Protected-access memory for cryptographic secrets +- [redact](https://lib.rs/crates/redact): A simple library for keeping secrets out of logs +- [noise](https://lib.rs/crates/noise): Procedural noise generation library +- [ulid](https://lib.rs/crates/ulid): a Universally Unique Lexicographically Sortable Identifier implementation + +#### Hashes +- [digest](https://lib.rs/crates/digest): Traits for cryptographic hash functions and message authentication codes +- [seahash](https://lib.rs/crates/seahash): A blazingly fast, portable hash function with proven statistical guarantees +- [highway](https://lib.rs/crates/highway): Native Rust port of Google's HighwayHash, which makes use of SIMD instructions for a fast and strong hash function +- [md5](https://lib.rs/crates/md5): The package provides the MD5 hash function +- [crc32c](https://lib.rs/crates/crc32c): Safe implementation for hardware accelerated CRC32C instructions with software fallback +- [blake3](https://lib.rs/crates/blake3): the BLAKE3 hash function +- [siphasher](https://lib.rs/crates/siphasher): SipHash-2-4, SipHash-1-3 and 128-bit variants in pure Rust +- [bcrypt](https://lib.rs/crates/bcrypt): Easily hash and verify passwords using bcrypt +- [sha1](https://lib.rs/crates/sha1): SHA-1 hash function +- [sha2](https://lib.rs/crates/sha2): Pure Rust implementation of the SHA-2 hash function family including SHA-224, SHA-256, SHA-384, and SHA-512 +- [sha3](https://lib.rs/crates/sha3): Pure Rust implementation of SHA-3, a family of Keccak-based hash functions including the SHAKE family of eXtendable-Output Functions (XOFs), as well as the accelerated variant TurboSHAKE ### Logging - [log](https://lib.rs/crates/log): A lightweight logging facade for Rust -- [tracing](https://lib.rs/crates/tracing): advanced logger - [env_logger](https://lib.rs/crates/env_logger): A logging implementation for `log` which is configured via an environment variable +- [prometheus](https://lib.rs/crates/prometheus): Prometheus instrumentation library for Rust applications +- [opentelemetry](https://lib.rs/crates/opentelemetry): OpenTelemetry API for Rust +- [sentry-core](https://lib.rs/crates/sentry-core): Core sentry library used for instrumentation and integration development +- [logging_timer](https://lib.rs/crates/logging_timer): Simple timers that log the elapsed time when dropped +- [dioxus-logger](https://lib.rs/crates/dioxus-logger): A logging utility to provide a standard interface whether you're targeting web desktop, fullstack, and more in Dioxus +- [tracing](https://lib.rs/crates/tracing): advanced logger +- [tracing-appender](https://lib.rs/crates/tracing-appender): Provides utilities for file appenders and making non-blocking writers +- [tracing-loki](https://lib.rs/crates/tracing-loki): A tracing layer for shipping logs to Grafana Loki ### Mail - [lettre](https://lib.rs/crates/lettre): [Email](../../../internet/eMail.md) client @@ -982,24 +1094,93 @@ Currently, all supported targets follow the assembly code syntax used by LLVM's ### Templates - [maud](https://lib.rs/crates/maud): Compile-time [HTML](../../../internet/HTML.md) templates - [tera](https://lib.rs/crates/tera): Template engine based on [Jinja](../../../tools/Jinja.md) templates +- [subst](https://lib.rs/crates/subst): shell-like variable substitution +- [minijinja](https://lib.rs/crates/minijinja): a powerful template engine for Rust with minimal dependencies +- [handlebars](https://lib.rs/crates/handlebars): Handlebars templating implemented in Rust ### Media +#### Images - [image](https://lib.rs/crates/image): Imaging library. Provides basic image processing and encoders/decoders for common image formats. +- [rgb](https://lib.rs/crates/rgb): Pixel types for Rust +- [qrcode](https://lib.rs/crates/qrcode): QR code encoder in Rust +- [gif](https://lib.rs/crates/gif): GIF de- and encoder +- [opencv](https://lib.rs/crates/opencv): Rust bindings for OpenCV +- [imgref](https://lib.rs/crates/imgref): A basic 2-dimensional slice for safe and convenient handling of pixel buffers with width, height & stride +- [palette](https://lib.rs/crates/palette): Convert and manage colors with a focus on correctness, flexibility and ease of use +- [imageproc](https://lib.rs/crates/imageproc): Image processing operations +- [resvg](https://lib.rs/crates/resvg): An SVG rendering library +- [png](https://lib.rs/crates/png): PNG decoding and encoding library in pure Rust +- [webp](https://lib.rs/crates/webp): WebP conversion library +- [image_hasher](https://lib.rs/crates/image_hasher): A simple library that provides perceptual hashing and difference calculation for images +- [dify](https://lib.rs/crates/dify): A fast pixel-by-pixel image comparison tool in Rust +- [qoi](https://lib.rs/crates/qoi): VERY fast encoder/decoder for QOI (Quite Okay Image) format +- [auto-palette](https://lib.rs/crates/auto-palette): 🎨 A Rust library that extracts prominent color palettes from images automatically +- [blockhash](https://lib.rs/crates/blockhash): A perceptual hashing algorithm for detecting similar images + +#### Video +- [ffmpeg-next](https://lib.rs/crates/ffmpeg-next): Safe FFmpeg wrapper +- [video-rs](https://lib.rs/crates/video-rs): High-level video toolkit based on ffmpeg +- [ffprobe](https://lib.rs/crates/ffprobe): Typed wrapper for the ffprobe CLI + +#### Audio +- [symphonia](https://lib.rs/crates/symphonia): Pure Rust media container and audio decoding library +- [hound](https://lib.rs/crates/hound): A wav encoding and decoding library +- [id3](https://lib.rs/crates/id3): A library for reading and writing ID3 metadata +- [metaflac](https://lib.rs/crates/metaflac): A library for reading and writing FLAC metadata +- [bliss-audio](https://lib.rs/crates/bliss-audio): A song analysis library for making playlists + +### 3D +- [glam](https://lib.rs/crates/glam): A simple and fast 3D math library for games and graphics +- [tobj](https://lib.rs/crates/tobj): A lightweight OBJ loader in the spirit of tinyobjloader +- [obj-rs](https://lib.rs/crates/obj-rs): Wavefront obj parser for Rust. It handles both 'obj' and 'mtl' formats. ### CLI -- [rustyline](https://lib.rs/crates/rustyline): Rustyline, a readline implementation based on Antirez's Linenoise -- [clap](https://lib.rs/crates/clap): A simple to use, efficient, and full-featured Command Line Argument Parser -- [crossterm](https://lib.rs/crates/crossterm): A crossplatform terminal library for manipulating terminals -- [indicatif](https://lib.rs/crates/indicatif): A progress bar and cli reporting library for Rust - [argh](https://lib.rs/crates/argh): Derive-based argument parser optimized for code size -- [owo-colors](https://lib.rs/crates/owo-colors): Zero-allocation terminal colors that'll make people go owo +- [clap](https://lib.rs/crates/clap): A simple to use, efficient, and full-featured Command Line Argument Parser - [yansi](https://lib.rs/crates/yansi): A dead simple ANSI terminal color painting library +- [owo-colors](https://lib.rs/crates/owo-colors): Zero-allocation terminal colors that'll make people go owo +- [named-colour](https://lib.rs/crates/named-colour): named-colour provides Hex Codes for popular colour names +- [colored](https://lib.rs/crates/colored): The most simple way to add colors in your terminal +- [crossterm](https://lib.rs/crates/crossterm): A crossplatform terminal library for manipulating terminals +- [trauma](https://lib.rs/crates/trauma): Simplify and prettify HTTP downloads +- [comfy-table](https://lib.rs/crates/comfy-table): An easy to use library for building beautiful tables with automatic content wrapping +- [tabled](https://lib.rs/crates/tabled): An easy to use library for pretty print tables of Rust structs and enums +- [tabular](https://lib.rs/crates/tabular): Plain text tables, aligned automatically +- [rustyline](https://lib.rs/crates/rustyline): Rustyline, a readline implementation based on Antirez's Linenoise +- [rpassword](https://lib.rs/crates/rpassword): Read passwords in console applications +- [inquire](https://lib.rs/crates/inquire): inquire is a library for building interactive prompts on terminals +- [indicatif](https://lib.rs/crates/indicatif): A progress bar and cli reporting library for Rust +- [spinners](https://lib.rs/crates/spinners): Elegant terminal spinners for Rust +- [is-terminal](https://lib.rs/crates/is-terminal): Test whether a given stream is a terminal +- [bishop](https://lib.rs/crates/bishop): Library for visualizing keys and hashes using OpenSSH's Drunken Bishop algorithm +- [termimad](https://lib.rs/crates/termimad): Markdown Renderer for the Terminal +- [rust-script](https://lib.rs/crates/rust-script): Command-line tool to run Rust "scripts" which can make use of crates +- [sysinfo](https://lib.rs/crates/sysinfo): Library to get system information such as processes, CPUs, disks, components and networks +- [which](https://lib.rs/crates/which): A Rust equivalent of Unix command "which". Locate installed executable in cross platforms. +- [ctrlc](https://lib.rs/crates/ctrlc): Easy Ctrl-C handler for Rust projects +- [subprocess](https://lib.rs/crates/subprocess): Execution of child processes and pipelines, inspired by Python's subprocess module, with Rust-specific extensions +- [cmd_lib](https://lib.rs/crates/cmd_lib): Common rust commandline macros and utils, to write shell script like tasks easily ### Compression - [flate2](https://lib.rs/crates/flate2): DEFLATE compression and decompression exposed as Read/BufRead/Write streams. Supports miniz_oxide and multiple zlib implementations. Supports zlib, gzip, and raw deflate streams. - [tar](https://lib.rs/crates/tar): A Rust implementation of a [TAR](../../../applications/cli/compression/tar.md) file reader and writer. - [zstd](https://lib.rs/crates/zstd): Binding for the [zstd compression](../../../files/Zstd%20Compression.md) library - [unrar](https://lib.rs/crates/unrar): list and extract RAR archives +- [zip](https://lib.rs/crates/zip): Library to support the reading and writing of zip files +- [brotli](https://lib.rs/crates/brotli): A brotli compressor and decompressor +- [huffman-compress2](https://lib.rs/crates/huffman-compress2): Huffman compression given a probability distribution over arbitrary symbols +- [arithmetic-coding](https://lib.rs/crates/arithmetic-coding): fast and flexible arithmetic coding library + +### Cache +- [lru](https://lib.rs/crates/lru): A LRU cache implementation +- [moka](https://lib.rs/crates/moka): A fast and concurrent cache library inspired by Java Caffeine +- [ustr](https://lib.rs/crates/ustr): Fast, FFI-friendly string interning +- [cacache](https://lib.rs/crates/cacache): Content-addressable, key-value, high-performance, on-disk cache +- [cached](https://crates.io/crates/cached): Caching Crate +- [memoize](https://lib.rs/crates/memoize): Attribute macro for auto-memoizing functions with somewhat-simple signatures +- [internment](https://lib.rs/crates/internment): Easy interning of data +- [http-cache-semantics](https://lib.rs/crates/http-cache-semantics): RFC 7234. Parses HTTP headers to correctly compute cacheability of responses, even in complex cases +- [assets_manager](https://lib.rs/crates/assets_manager): Conveniently load, cache, and reload external resources ### Databases - [rusqlite](https://lib.rs/crates/rusqlite): Ergonomic wrapper for [SQLite](../SQLite.md) @@ -1008,34 +1189,291 @@ Currently, all supported targets follow the assembly code syntax used by LLVM's - [rocksdb](https://lib.rs/crates/rocksdb): embedded database - [uuid](https://lib.rs/crates/uuid): UUID Generation - [polars](https://lib.rs/crates/polars): Dataframes computation +- [surrealdb](https://crates.io/crates/surrealdb): A scalable, distributed, collaborative, document-graph database, for the realtime web +- [sql-builder](https://lib.rs/crates/sql-builder): Simple SQL code generator +- [pgvector](https://lib.rs/crates/pgvector): pgvector support for Rust +- [sea-orm](https://lib.rs/crates/sea-orm): 🐚 An async & dynamic ORM for Rust +- [sled](https://lib.rs/crates/sled): Lightweight high-performance pure-rust transactional embedded database ### Date and Time - [chrono](https://lib.rs/crates/chrono): Date and time library for Rust +- [chrono-tz](https://lib.rs/crates/chrono-tz): TimeZone implementations for chrono from the IANA database - [humantime](https://lib.rs/crates/humantime): A parser and formatter for `std::time::{Duration, SystemTime}` +- [duration-str](https://lib.rs/crates/duration-str): duration string parser +- [cron](https://lib.rs/crates/cron): A cron expression parser and schedule explorer +- [dateparser](https://lib.rs/crates/dateparser): Parse dates in string formats that are commonly used +- [icalendar](https://lib.rs/crates/icalendar): Strongly typed iCalendar builder and parser + +### Network +- [tower](https://lib.rs/crates/tower): Tower is a library of modular and reusable components for building robust clients and servers +- [tungstenite](https://lib.rs/crates/tungstenite): Lightweight stream-based WebSocket implementation +- [tokio-websockets](http://ocean.hydrar.de/s/lib.rs/crates/tokio-websockets): High performance, strict, tokio-util based WebSockets implementation +- [message-io](https://lib.rs/crates/message-io): Fast and easy-to-use event-driven network library +- [ipnet](https://lib.rs/crates/ipnet): Provides types and useful methods for working with IPv4 and IPv6 network addresses +- [object_store](https://lib.rs/crates/object_store): A generic object store interface for uniformly interacting with AWS S3, Google Cloud Storage, Azure Blob Storage and local files +- [matchit](https://lib.rs/crates/matchit): A high performance, zero-copy URL router +- [tun](https://lib.rs/crates/tun): TUN device creation and handling +- [quiche](https://lib.rs/crates/quiche): 🥧 Savoury implementation of the QUIC transport protocol and HTTP/3 +- [arti-client](https://lib.rs/crates/arti-client): Library for connecting to the Tor network as an anonymous client +- [etherparse](https://lib.rs/crates/etherparse): A library for parsing & writing a bunch of packet based protocols (EthernetII, IPv4, IPv6, UDP, TCP ...) +- [ldap3](https://lib.rs/crates/ldap3): Pure-Rust LDAP Client +- [hyperlocal](https://lib.rs/crates/hyperlocal): Hyper bindings for Unix domain sockets +- [openssh-sftp-client](https://lib.rs/crates/openssh-sftp-client): Highlevel API used to communicate with openssh sftp server +- [swarm-discovery](https://lib.rs/crates/swarm-discovery): Discovery service for IP-based swarms +- [libmdns](https://lib.rs/crates/libmdns): mDNS Responder library for building discoverable LAN services in Rust +- [networkmanager](https://lib.rs/crates/networkmanager): Bindings for the Linux NetworkManager +- [renet](https://lib.rs/crates/renet): Server/Client network library for multiplayer games with authentication and connection management +- [dhcproto](https://lib.rs/crates/dhcproto): A DHCP parser and encoder for DHCPv4/DHCPv6. dhcproto aims to be a functionally complete DHCP implementation. +- [irc](https://lib.rs/crates/irc): the irc crate – usable, async IRC for Rust +- [ssh2](https://lib.rs/crates/ssh2): Bindings to libssh2 for interacting with SSH servers and executing remote commands, forwarding local ports, etc +- [openssh](https://lib.rs/crates/openssh): SSH through OpenSSH +- [amqprs](https://lib.rs/crates/amqprs): AMQP 0-9-1 client implementation for RabbitMQ +- [wyoming](https://lib.rs/crates/wyoming): Abstractions over the Wyoming protocol ### HTTP - [hyper](https://lib.rs/crates/hyper): A fast and correct [HTTP](../../../internet/HTTP.md) library - [reqwest](https://lib.rs/crates/reqwest): higher level [HTTP](../../../internet/HTTP.md) client library +- [ureq](https://lib.rs/crates/ureq): Simple, safe HTTP client +- [curl](https://lib.rs/crates/curl): Rust bindings to libcurl for making HTTP requests - [actix-web](https://lib.rs/crates/actix-web): Actix Web is a powerful, pragmatic, and extremely fast web framework for Rust - [rocket](https://lib.rs/crates/rocket): web server framework for Rust +- [thirtyfour](https://lib.rs/crates/thirtyfour): Thirtyfour is a Selenium / WebDriver library for Rust, for automated website UI testing +- [http-types](https://lib.rs/crates/http-types): Common types for HTTP operations +- [headers](https://lib.rs/crates/headers): typed HTTP headers +- [cookie](https://lib.rs/crates/cookie): HTTP cookie parsing and cookie jar management. Supports signed and private (encrypted, authenticated) jars. +- [http](https://lib.rs/crates/http): A set of types for representing HTTP requests and responses +- [h2](https://lib.rs/crates/h2): An HTTP/2 client and server +- [h3](https://lib.rs/crates/h3): An async HTTP/3 implementation +- [mime](https://lib.rs/crates/mime): Strongly Typed Mimes +- [scraper](https://lib.rs/crates/scraper): HTML parsing and querying with CSS selectors +- [selectors](https://lib.rs/crates/selectors): CSS Selectors matching for Rust +- [spider](https://lib.rs/crates/spider): A web crawler and scraper, building blocks for data curation workloads +- [htmlize](https://lib.rs/crates/htmlize): Encode and decode HTML entities in UTF-8 according to the standard +- [ammonia](https://lib.rs/crates/ammonia): HTML Sanitization +- [rookie](https://lib.rs/crates/rookie): Load cookie from your web browsers +- [tonic](https://lib.rs/crates/tonic): A gRPC over HTTP/2 implementation focused on high performance, interoperability, and flexibility +- [web-sys](https://lib.rs/crates/web-sys): Bindings for all Web APIs, a procedurally generated crate from WebIDL +- [jsonwebtoken](https://lib.rs/crates/jsonwebtoken): Create and decode JWTs in a strongly typed way +- [http-range-header](https://lib.rs/crates/http-range-header): No-dep range header parser + +#### Axum +- [axum](https://lib.rs/crates/axum): Web framework that focuses on ergonomics and modularity +- [axum-valid](https://crates.io/crates/axum-valid): Provides validation extractors for your Axum application, allowing you to validate data using validator, garde, validify or all of them. +- [axum-prometheus](https://crates.io/crates/axum-prometheus): A tower middleware to collect and export HTTP metrics for Axum +- [axum-htmx](https://crates.io/crates/axum-htmx): A set of htmx extractors, responders, and request guards for axum. +- [axum_session](https://crates.io/crates/axum_session): 📝 Session management layer for axum that supports HTTP and Rest. +- [axum_csrf](https://crates.io/crates/axum_csrf): Library to Provide a CSRF (Cross-Site Request Forgery) protection layer. ### Text - [regex](https://lib.rs/crates/regex): An implementation of [regular expressions](../../../tools/Regex.md) for Rust. This implementation uses finite automata and guarantees linear time matching on all inputs. -- [comfy-table](https://lib.rs/crates/comfy-table): An easy to use library for building beautiful tables with automatic content wrapping +- [fancy-regex](https://lib.rs/crates/fancy-regex): An implementation of regexes, supporting a relatively rich set of features, including backreferences and look-around +- [pretty_regex](https://lib.rs/crates/pretty_regex): 🧶 Elegant and readable way of writing regular expressions - [similar](https://lib.rs/crates/similar): A diff library for Rust +- [dissimilar](https://lib.rs/crates/dissimilar): Diff library with semantic cleanup, based on Google's diff-match-patch +- [strsim](https://lib.rs/crates/strsim): Implementations of string similarity metrics. Includes Hamming, Levenshtein, OSA, Damerau-Levenshtein, Jaro, Jaro-Winkler, and Sørensen-Dice. +- [enquote](https://lib.rs/crates/enquote): Quotes and unquotes strings +- [emojis](https://lib.rs/crates/emojis): ✨ Lookup emoji in *O(1)* time, access metadata and GitHub shortcodes, iterate over all emoji, and more! +- [text-splitter](https://lib.rs/crates/text-splitter): Split text into semantic chunks, up to a desired chunk size. Supports calculating length by characters and tokens, and is callable from Rust and Python. +- [wildcard](https://lib.rs/crates/wildcard): Wildcard matching +- [wildmatch](https://lib.rs/crates/wildmatch): Simple string matching with single- and multi-character wildcard operator +- [textwrap](https://lib.rs/crates/textwrap): Library for word wrapping, indenting, and dedenting strings. Has optional support for Unicode and emojis as well as machine hyphenation. +- [pad](https://lib.rs/crates/pad): Library for padding strings at runtime +- [const-str](https://lib.rs/crates/const-str): compile-time string operations +- [const_format](https://lib.rs/crates/const_format): Compile-time string formatting +- [convert_case](https://lib.rs/crates/convert_case): Convert strings into any case +- [heck](https://lib.rs/crates/heck): heck is a case conversion library +- [html2md](https://lib.rs/crates/html2md): Library to convert simple html documents into markdown + +### AI +- [safetensors](https://lib.rs/crates/safetensors): Provides functions to read and write safetensors which aim to be safer than their PyTorch counterpart. +- [burn](https://lib.rs/crates/burn): Flexible and Comprehensive Deep Learning Framework in Rust +- [ollama-rs](https://lib.rs/crates/ollama-rs): A Rust library for interacting with the Ollama API +- [linfa](https://lib.rs/crates/linfa): A Machine Learning framework for Rust +- [neurons](https://lib.rs/crates/neurons): Neural networks from scratch, in Rust ### Concurrency - [parking_lot](https://lib.rs/crates/parking_lot): More compact and efficient implementations of the standard synchronization primitives - [crossbeam](https://lib.rs/crates/crossbeam): Tools for concurrent programming - [rayon](https://lib.rs/crates/rayon): Simple work-stealing parallelism for Rust - [dashmap](https://lib.rs/crates/dashmap): fast hashmap +- [spin](https://lib.rs/crates/spin): Spin-based synchronization primitives +- [flume](https://lib.rs/crates/flume): A blazingly fast multi-producer channel +- [state](https://lib.rs/crates/state): A library for safe and effortless global and thread-local state management +- [atomic](https://lib.rs/crates/atomic): Generic `Atomic` wrapper type +- [yaque](https://lib.rs/crates/yaque): Yaque is yet another disk-backed persistent queue for Rust +- [kanal](https://lib.rs/crates/kanal): The fast sync and async channel that Rust deserves + +### Memory Management +- [jemallocator](https://lib.rs/crates/jemallocator): jemalloc allocator +- [memmap2](https://lib.rs/crates/memmap2): Map something to memory +- [sharded-slab](https://lib.rs/crates/sharded-slab): lock free concurrent slab allocation +- [heapless](https://lib.rs/crates/heapless): static friendly data structures without heap allocation +- [bumpalo](https://lib.rs/crates/bumpalo): bump allocation arena +- [singlyton](https://lib.rs/crates/singlyton): [Singleton](../patterns/creational/Singleton%20Pattern.md) for Rust +- [pipe](https://lib.rs/crates/pipe): Synchronous Read/Write memory pipe +- [memory_storage](https://lib.rs/crates/memory_storage): Vec like data structure with constant index +- [effective-limits](https://lib.rs/crates/effective-limits): Estimate effective resource limits for a process +- [iter-chunks](https://lib.rs/crates/iter-chunks): Extend Iterator with chunks +- [shared_vector](https://lib.rs/crates/shared_vector): Reference counted vector data structure +- [census](https://lib.rs/crates/census): Keeps an inventory of living objects +- [static_cell](https://lib.rs/crates/static_cell): Statically allocated, initialized at runtime cell +- [arcstr](https://lib.rs/crates/arcstr): A better reference-counted string type, with zero-cost (allocation-free) support for string literals, and reference counted substrings +- [bytebuffer](https://lib.rs/crates/bytebuffer): A bytebuffer for networking and binary protocols + +### Science +- [syunit](https://lib.rs/crates/syunit): SI Units +- [uom](https://lib.rs/crates/uom): Units of measurement +- [measurements](https://lib.rs/crates/measurements): Handle metric, imperial, and other measurements with ease! Types: Length, Temperature, Weight, Volume, Pressure +- [t4t](https://lib.rs/crates/t4t): game theory toolbox + +### Hardware / Embedded +- [virt](https://lib.rs/crates/virt): Rust bindings to the libvirt C library +- [qapi](https://lib.rs/crates/qapi): QEMU QMP and Guest Agent API +- [bootloader](https://lib.rs/crates/bootloader): An experimental x86_64 bootloader that works on both BIOS and UEFI systems +- [embedded-graphics](https://lib.rs/crates/embedded-graphics): Embedded graphics library for small hardware displays +- [riscv](https://lib.rs/crates/riscv): Low level access to RISC-V processors +- [aarch64-cpu](https://lib.rs/crates/aarch64-cpu): Low level access to processors using the AArch64 execution state +- [uefi](https://lib.rs/crates/uefi): safe UEFI wrapper +- [elf](https://lib.rs/crates/elf): A pure-rust library for parsing ELF files +- [smoltcp](https://lib.rs/crates/smoltcp): A TCP/IP stack designed for bare-metal, real-time systems without a heap +- [fatfs](https://lib.rs/crates/fatfs): FAT filesystem library + +### Metrics +- [criterion2](https://lib.rs/crates/criterion2): Statistics-driven micro-benchmarking library +- [inferno](https://lib.rs/crates/inferno): Rust port of the FlameGraph performance profiling tool suite +- [divan](https://lib.rs/crates/divan): Statistically-comfy benchmarking library + +### Testing +- [test-log](https://lib.rs/crates/test-log): A replacement of the `#[test]` attribute that initializes logging and/or tracing infrastructure before running tests +- [googletest](https://lib.rs/crates/googletest): A rich assertion and matcher library inspired by GoogleTest for C++ +- [predicates](https://lib.rs/crates/predicates): An implementation of boolean-valued predicate functions +- [validator](https://lib.rs/crates/validator): Common validation functions (email, url, length, …) and trait - to be used with validator_derive +- [garde](https://lib.rs/crates/garde): Validation library +- [fake](https://lib.rs/crates/fake): An easy to use library and command line for generating fake data like name, number, address, lorem, dates, etc +- [static_assertions](https://lib.rs/crates/static_assertions): Compile-time assertions to ensure that invariants are met + +### i18n +- [iso_currency](https://lib.rs/crates/iso_currency): ISO 4217 currency codes +- [iso_country](https://lib.rs/crates/iso_country): ISO3166-1 countries +- [sys-locale](https://lib.rs/crates/sys-locale): Small and lightweight library to obtain the active system locale ### Async - [tokio](https://lib.rs/crates/tokio): An event-driven, non-blocking I/O platform for writing asynchronous I/O backed applications - [futures](https://lib.rs/crates/futures): An implementation of futures and streams featuring zero allocations, composability, and iterator-like interfaces -- [once_cell](https://lib.rs/crates/once_cell): Lazy values +- [mio](https://lib.rs/crates/mio): Lightweight non-blocking I/O +- [deadpool](https://lib.rs/crates/deadpool): Dead simple async pool +- [blocking](https://lib.rs/crates/blocking): A thread pool for isolating blocking I/O in async programs +- [pollster](https://lib.rs/crates/pollster): Synchronously block the thread until a future completes +- [smol](https://lib.rs/crates/smol): A small and fast async runtime +- [async-stream](https://lib.rs/crates/async-stream): Asynchronous streams using async & await notation +- [async-trait](https://lib.rs/crates/async-trait): Type erasure for async trait methods ### Macros +- [proc-macro2](https://lib.rs/crates/proc-macro2): A substitute implementation of the compiler’s proc_macro API to decouple token-based libraries from the procedural macro use case - [syn](https://lib.rs/crates/syn): Parse Rust syntax into AST - [quote](https://lib.rs/crates/quote): Turn Rust syntax into TokenStream - [paste](https://lib.rs/crates/paste): Concat Rust idents + +### Build Tools +- [flamegraph](https://lib.rs/crates/flamegraph): A simple cargo subcommand for generating flamegraphs, using inferno under the hood +- [cargo-hack](https://lib.rs/crates/cargo-hack): Cargo subcommand to provide various options useful for testing and continuous integration +- [cargo-outdated](https://lib.rs/crates/cargo-outdated): Cargo subcommand for displaying when dependencies are out of date +- [cargo-binstall](https://lib.rs/crates/cargo-binstall): Binary installation for rust projects +- [cargo-cache](https://lib.rs/crates/cargo-cache): Manage cargo cache, show sizes and remove directories selectively +- [cargo-watch](https://lib.rs/crates/cargo-watch): Watches over your Cargo project’s source +- [cargo-expand](https://lib.rs/crates/cargo-expand): Wrapper around `rustc -Zunpretty=expanded`. Shows the result of macro expansion and `#[derive]` expansion. +- [cargo-audit](https://lib.rs/crates/cargo-audit): Audit Cargo.lock for crates with security vulnerabilities +- [cargo-aur](https://lib.rs/crates/cargo-aur): Prepare Rust projects to be released on the Arch Linux User Repository +- [cargo-bom](https://lib.rs/crates/cargo-bom): Bill of Materials for Rust Crates +- [cc](https://lib.rs/crates/cc): A build-time dependency for Cargo build scripts to assist in invoking the native C compiler to compile native C code into a static archive to be linked into Rust code +- [cmake](https://lib.rs/crates/cmake): A build dependency for running cmake to build a native library +- [cross](https://lib.rs/crates/cross): Zero setup cross compilation and cross testing +- [wasm-bindgen](https://lib.rs/crates/wasm-bindgen): Easy support for interacting between JS and Rust + +### Math +- [num](https://lib.rs/crates/num): A collection of numeric types and traits for Rust, including bigint, complex, rational, range iterators, generic integers, and more! +- [num-format](https://lib.rs/crates/num-format): A Rust crate for producing string-representations of numbers, formatted according to international standards +- [num-rational](https://lib.rs/crates/num-rational): Rational numbers implementation for Rust +- [num-complex](https://lib.rs/crates/num-complex): Complex numbers implementation for Rust +- [statrs](https://lib.rs/crates/statrs): Statistical computing library for Rust +- [bigdecimal](https://lib.rs/crates/bigdecimal): Arbitrary precision decimal numbers +- [nalgebra](https://lib.rs/crates/nalgebra): General-purpose linear algebra library with transformations and statically-sized or dynamically-sized matrices +- [euclid](https://lib.rs/crates/euclid): Geometry primitives +- [ultraviolet](https://lib.rs/crates/ultraviolet): A crate to do linear algebra, fast +- [peroxide](https://lib.rs/crates/peroxide): Rust comprehensive scientific computation library contains linear algebra, numerical analysis, statistics and machine learning tools with farmiliar syntax + +### Desktop +- [notify-rust](https://lib.rs/crates/notify-rust): Show desktop notifications (linux, bsd, mac). Pure Rust dbus client and server. +- [arboard](https://lib.rs/crates/arboard): Image and text handling for the OS clipboard + +### Configuration +- [config](https://lib.rs/crates/config): Layered configuration system for Rust applications +- [envy](https://lib.rs/crates/envy): deserialize env vars into typesafe structs + +### Language Extensions +#### Enums +- [strum](https://lib.rs/crates/strum): Helpful macros for working with enums and strings +- [enum_dispatch](https://lib.rs/crates/enum_dispatch): Near drop-in replacement for dynamic-dispatched method calls with up to 10x the speed +- [num_enum](https://lib.rs/crates/num_enum): Procedural macros to make inter-operation between primitives and enums easier +- [enum-display](https://lib.rs/crates/enum-display): A macro to derive Display for enums + +#### Memory +- [smol_str](https://lib.rs/crates/smol_str): small-string optimized string type with O(1) clone +- [beef](https://lib.rs/crates/beef): More compact Cow +- [dyn-clone](https://lib.rs/crates/dyn-clone): Clone trait that is dyn-compatible +- [memoffset](https://lib.rs/crates/memoffset): offset_of functionality for Rust structs +- [az](https://lib.rs/crates/az): Casts and checked casts +- [zerocopy](https://lib.rs/crates/zerocopy): Zerocopy makes zero-cost memory manipulation effortless. We write "unsafe" so you don't have to. +- [once_cell](https://lib.rs/crates/once_cell): Single assignment cells and lazy values +- [lazy_static](https://lib.rs/crates/lazy_static): A macro for declaring lazily evaluated statics in Rust +- [globals](https://lib.rs/crates/globals): Painless global variables in Rust +- [lazy_format](https://lib.rs/crates/lazy_format): A utility crate for lazily formatting values for later +- [fragile](https://lib.rs/crates/fragile): Provides wrapper types for sending non-send values to other threads + +#### Syntax +- [tap](https://lib.rs/crates/tap): Generic extensions for tapping values in Rust +- [option_trait](https://lib.rs/crates/option_trait): Helper traits for more generalized options +- [cascade](https://lib.rs/crates/cascade): Dart-like cascade macro for Rust +- [enclose](https://lib.rs/crates/enclose): A convenient macro, for cloning values into a closure +- [extend](https://lib.rs/crates/extend): Create extensions for types you don't own with extension traits but without the boilerplate +- [hex_lit](https://lib.rs/crates/hex_lit): Hex macro literals without use of hex macros +- [replace_with](https://lib.rs/crates/replace_with): Temporarily take ownership of a value at a mutable location, and replace it with a new value based on the old one +- [scopeguard](https://lib.rs/crates/scopeguard): A RAII scope guard that will run a given closure when it goes out of scope, even if the code between panics (assuming unwinding panic). +- [backon](https://lib.rs/crates/backon): Make retry like a built-in feature provided by Rust +- [tryhard](https://lib.rs/crates/tryhard): Easily retry futures +- [retry](https://lib.rs/crates/retry): Utilities for retrying operations that can fail +- [statum](https://lib.rs/crates/statum): Compile-time state machine magic for Rust: Zero-boilerplate typestate patterns with automatic transition validation +- [formatx](https://lib.rs/crates/formatx): A macro for formatting non literal strings at runtime +- [erased](https://lib.rs/crates/erased): Erase the type of a reference or box, retaining the lifetime +- [include_dir](https://lib.rs/crates/include_dir): Embed the contents of a directory in your binary +- [stacker](https://lib.rs/crates/stacker): A stack growth library useful when implementing deeply recursive algorithms that may accidentally blow the stack +- [recursive](https://lib.rs/crates/recursive): Easy recursion without stack overflows + +#### Type Extensions +- [itertools](https://lib.rs/crates/itertools): Extra iterator adaptors, iterator methods, free functions, and macros +- [itermore](https://lib.rs/crates/itermore): 🤸‍♀️ More iterator adaptors +- [derive_more](https://lib.rs/crates/derive_more): Adds #[derive(x)] macros for more traits +- [derive_builder](https://lib.rs/crates/derive_builder): Rust macro to automatically implement the builder pattern for arbitrary structs +- [ordered-float](https://lib.rs/crates/ordered-float): Wrappers for total ordering on floats +- [stdext](https://lib.rs/crates/stdext): Extensions for the Rust standard library structures +- [bounded-integer](https://lib.rs/crates/bounded-integer): Bounded integers +- [tuples](https://lib.rs/crates/tuples): Provides many useful tools related to tuples +- [fallible-iterator](https://lib.rs/crates/fallible-iterator): Fallible iterator traits +- [sequential](https://lib.rs/crates/sequential): A configurable sequential number generator + +#### Compilation +- [cfg-if](https://lib.rs/crates/cfg-if): A macro to ergonomically define an item depending on a large number of #[cfg] parameters. Structured like an if-else chain, the first matching branch is the item that gets emitted. +- [cfg_aliases](https://lib.rs/crates/cfg_aliases): A tiny utility to help save you a lot of effort with long winded #[cfg()] checks +- [nameof](https://lib.rs/crates/nameof): Provides a Rust macro to determine the string name of a binding, type, const, or function +- [tynm](https://lib.rs/crates/tynm): Returns type names in shorter form + +#### Const +- [constcat](https://lib.rs/crates/constcat): concat! with support for const variables and expressions +- [konst](https://lib.rs/crates/konst): Const equivalents of std functions, compile-time comparison, and parsing + +### Geo +- [geo](https://lib.rs/crates/geo): Geospatial primitives and algorithms +- [geojson](https://lib.rs/crates/geojson): Read and write GeoJSON vector geographic data +- [geozero](https://lib.rs/crates/geozero): Zero-Copy reading and writing of geospatial data in WKT/WKB, GeoJSON, MVT, GDAL, and other formats +- [versatiles](https://lib.rs/crates/versatiles): A toolbox for converting, checking and serving map tiles in various formats +- [ipcap](https://lib.rs/crates/ipcap): 🌍 A CLI & library for decoding IP addresses into state, postal code, country, coordinates, etc without internet access From 61b65a08296888c1aa2ab3b2d278faaa003c1ad5 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Tue, 8 Apr 2025 11:07:33 +0200 Subject: [PATCH 40/99] =?UTF-8?q?=E2=9C=A8=20add=20ulid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- technology/dev/ULID.md | 126 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 technology/dev/ULID.md diff --git a/technology/dev/ULID.md b/technology/dev/ULID.md new file mode 100644 index 0000000..259e509 --- /dev/null +++ b/technology/dev/ULID.md @@ -0,0 +1,126 @@ +--- +obj: concept +repo: https://github.com/ulid/spec +aliases: ["Universally Unique Lexicographically Sortable Identifier"] +--- + +# ULID (Universally Unique Lexicographically Sortable Identifier) +UUID can be suboptimal for many use-cases because: + +- It isn't the most character efficient way of encoding 128 bits of randomness +- UUID v1/v2 is impractical in many environments, as it requires access to a unique, stable MAC address +- UUID v3/v5 requires a unique seed and produces randomly distributed IDs, which can cause fragmentation in many data structures +- UUID v4 provides no other information than randomness which can cause fragmentation in many data structures + +Instead, herein is proposed ULID: + +```javascript +ulid() // 01ARZ3NDEKTSV4RRFFQ69G5FAV +``` + +- 128-bit compatibility with UUID +- 1.21e+24 unique ULIDs per millisecond +- Lexicographically sortable! +- Canonically encoded as a 26 character string, as opposed to the 36 character UUID +- Uses Crockford's base32 for better efficiency and readability (5 bits per character) +- Case insensitive +- No special characters (URL safe) +- Monotonic sort order (correctly detects and handles the same millisecond) + +## Specification +Below is the current specification of ULID as implemented in [ulid/javascript](https://github.com/ulid/javascript). + +*Note: the binary format has not been implemented in JavaScript as of yet.* + +``` + 01AN4Z07BY 79KA1307SR9X4MV3 + +|----------| |----------------| + Timestamp Randomness + 48bits 80bits +``` + +### Components + +**Timestamp** +- 48 bit integer +- UNIX-time in milliseconds +- Won't run out of space 'til the year 10889 AD. + +**Randomness** +- 80 bits +- Cryptographically secure source of randomness, if possible + +### Sorting +The left-most character must be sorted first, and the right-most character sorted last (lexical order). The default ASCII character set must be used. Within the same millisecond, sort order is not guaranteed + +### Canonical String Representation + +``` +ttttttttttrrrrrrrrrrrrrrrr + +where +t is Timestamp (10 characters) +r is Randomness (16 characters) +``` + +#### Encoding +Crockford's Base32 is used as shown. This alphabet excludes the letters I, L, O, and U to avoid confusion and abuse. + +``` +0123456789ABCDEFGHJKMNPQRSTVWXYZ +``` + +### Monotonicity +When generating a ULID within the same millisecond, we can provide some guarantees regarding sort order. Namely, if the same millisecond is detected, the `random` component is incremented by 1 bit in the least significant bit position (with carrying). For example: + +```javascript +import { monotonicFactory } from 'ulid' + +const ulid = monotonicFactory() + +// Assume that these calls occur within the same millisecond +ulid() // 01BX5ZZKBKACTAV9WEVGEMMVRZ +ulid() // 01BX5ZZKBKACTAV9WEVGEMMVS0 +``` + +If, in the extremely unlikely event that, you manage to generate more than $2^{80}$ ULIDs within the same millisecond, or cause the random component to overflow with less, the generation will fail. + +```javascript +import { monotonicFactory } from 'ulid' + +const ulid = monotonicFactory() + +// Assume that these calls occur within the same millisecond +ulid() // 01BX5ZZKBKACTAV9WEVGEMMVRY +ulid() // 01BX5ZZKBKACTAV9WEVGEMMVRZ +ulid() // 01BX5ZZKBKACTAV9WEVGEMMVS0 +ulid() // 01BX5ZZKBKACTAV9WEVGEMMVS1 +... +ulid() // 01BX5ZZKBKZZZZZZZZZZZZZZZX +ulid() // 01BX5ZZKBKZZZZZZZZZZZZZZZY +ulid() // 01BX5ZZKBKZZZZZZZZZZZZZZZZ +ulid() // throw new Error()! +``` + +#### Overflow Errors when Parsing Base32 Strings +Technically, a 26-character Base32 encoded string can contain 130 bits of information, whereas a ULID must only contain 128 bits. Therefore, the largest valid ULID encoded in Base32 is `7ZZZZZZZZZZZZZZZZZZZZZZZZZ`, which corresponds to an epoch time of `281474976710655` or $2^{48}-1$. + +Any attempt to decode or encode a ULID larger than this should be rejected by all implementations, to prevent overflow bugs. + +### Binary Layout and Byte Order +The components are encoded as 16 octets. Each component is encoded with the Most Significant Byte first (network byte order). + +``` +0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| 32_bit_uint_time_high | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| 16_bit_uint_time_low | 16_bit_uint_random | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| 32_bit_uint_random | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| 32_bit_uint_random | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +``` From 4406c980852842cdf5793c82095f70094905e89c Mon Sep 17 00:00:00 2001 From: JMARyA Date: Tue, 8 Apr 2025 11:08:57 +0200 Subject: [PATCH 41/99] =?UTF-8?q?=E2=9C=A8=20add=20rustscript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../applications/development/rust-script.md | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 technology/applications/development/rust-script.md diff --git a/technology/applications/development/rust-script.md b/technology/applications/development/rust-script.md new file mode 100644 index 0000000..245b24f --- /dev/null +++ b/technology/applications/development/rust-script.md @@ -0,0 +1,127 @@ +--- +obj: application +repo: https://github.com/fornwall/rust-script +website: https://rust-script.org +--- + +# RustScript +With rust-script Rust files and expressions can be executed just like a shell or Python script. Features include: +- Caching compiled artifacts for speed. +- Reading Cargo manifests embedded in Rust scripts. +- Supporting executable Rust scripts via Unix shebangs and Windows file associations. +- Using expressions as stream filters (i.e. for use in command pipelines). +- Running unit tests and benchmarks from scripts. + +## Scripts +The primary use for rust-script is for running Rust source files as scripts. For example: + +``` +$ echo 'println!("Hello, World!");' > hello.rs +$ rust-script hello.rs +Hello, World! +``` + +Under the hood, a Cargo project will be generated and built (with the Cargo output hidden unless compilation fails or the `-c/--cargo-output` option is used). The first invocation of the script will be slower as the script is compiled - subsequent invocations of unmodified scripts will be fast as the built executable is cached. + +As seen from the above example, using a `fn main() {}` function is not required. If not present, the script file will be wrapped in a `fn main() { ... }` block. + +rust-script will look for embedded dependency and manifest information in the script as shown by the below two equivalent `now.rs` variants: + +```rust +#!/usr/bin/env rust-script +//! This is a regular crate doc comment, but it also contains a partial +//! Cargo manifest. Note the use of a *fenced* code block, and the +//! `cargo` "language". +//! +//! ```cargo +//! [dependencies] +//! time = "0.1.25" +//! ``` +fn main() { + println!("{}", time::now().rfc822z()); +} +``` + +```rust +// cargo-deps: time="0.1.25" +// You can also leave off the version number, in which case, it's assumed +// to be "*". Also, the `cargo-deps` comment *must* be a single-line +// comment, and it *must* be the first thing in the file, after the +// shebang. +// Multiple dependencies should be separated by commas: +// cargo-deps: time="0.1.25", libc="0.2.5" +fn main() { + println!("{}", time::now().rfc822z()); +} +``` + +The output from running one of the above scripts may look something like: + +``` +$ rust-script now +Wed, 28 Oct 2020 00:38:45 +0100 +``` + +## Useful command-line arguments: + +- `--bench`: Compile and run benchmarks. Requires a nightly toolchain. +- `--debug`: Build a debug executable, not an optimised one. +- `--force`: Force the script to be rebuilt. Useful if you want to force a recompile with a different toolchain. +- `--package`: Generate the Cargo package and print the path to it - but don’t compile or run it. Effectively “unpacks” the script into a Cargo package. +- `--test`: Compile and run tests. +- `--wrapper`: Add a wrapper around the executable. Can be used to run debugging with e.g. `rust-script --debug --wrapper rust-lldb my-script.rs` or benchmarking with `rust-script --wrapper "hyperfine --runs 100" my-script.rs` + +## Executable Scripts +On Unix systems, you can use `#!/usr/bin/env rust-script` as a shebang line in a Rust script. This will allow you to execute a script files (which don’t need to have the `.rs` file extension) directly. + +If you are using Windows, you can associate the `.ers` extension (executable Rust - a renamed `.rs` file) with rust-script. This allows you to execute Rust scripts simply by naming them like any other executable or script. + +This can be done using the `rust-script --install-file-association` command. Uninstall the file association with `rust-script --uninstall-file-association`. + +If you want to make a script usable across platforms, use both a shebang line and give the file a `.ers` file extension. + +## Expressions +Using the `-e/--expr` option a Rust expression can be evaluated directly, with dependencies (if any) added using `-d/--dep`: + +``` +$ rust-script -e '1+2' +3 +$ rust-script --dep time --expr "time::OffsetDateTime::now_utc().format(time::Format::Rfc3339).to_string()"` +"2020-10-28T11:42:10+00:00" +$ # Use a specific version of the time crate (instead of default latest): +$ rust-script --dep time=0.1.38 -e "time::now().rfc822z().to_string()" +"2020-10-28T11:42:10+00:00" +``` + +The code given is embedded into a block expression, evaluated, and printed out using the Debug formatter (i.e. `{:?}`). + +## Filters +You can use rust-script to write a quick filter, by specifying a closure to be called for each line read from stdin, like so: + +``` +$ cat now.ers | rust-script --loop \ + "let mut n=0; move |l| {n+=1; println!(\"{:>6}: {}\",n,l.trim_end())}" + 1: // cargo-deps: time="0.1.25" + 3: fn main() { + 4: println!("{}", time::now().rfc822z()); + 5: } +``` + +You can achieve a similar effect to the above by using the `--count` flag, which causes the line number to be passed as a second argument to your closure: + +``` +$ cat now.ers | rust-script --count --loop \ + "|l,n| println!(\"{:>6}: {}\", n, l.trim_end())" + 1: // cargo-deps: time="0.1.25" + 2: fn main() { + 3: println!("{}", time::now().rfc822z()); + 4: } +``` + +## Environment Variables +The following environment variables are provided to scripts by rust-script: + +- `$RUST_SCRIPT_BASE_PATH`: the base path used by rust-script to resolve relative dependency paths. Note that this is not necessarily the same as either the working directory, or the directory in which the script is being compiled. +- `$RUST_SCRIPT_PKG_NAME`: the generated package name of the script. +- `$RUST_SCRIPT_SAFE_NAME`: the file name of the script (sans file extension) being run. For scripts, this is derived from the script’s filename. May also be `expr` or `loop` for those invocations. +- `$RUST_SCRIPT_PATH`: absolute path to the script being run, assuming one exists. Set to the empty string for expressions. From b45b4f651985ea0ca781cb3b4bd10616cb3a4cec Mon Sep 17 00:00:00 2001 From: JMARyA Date: Tue, 8 Apr 2025 19:01:28 +0200 Subject: [PATCH 42/99] fix --- technology/applications/cli/intermodal.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/technology/applications/cli/intermodal.md b/technology/applications/cli/intermodal.md index d322d70..14dc5b8 100644 --- a/technology/applications/cli/intermodal.md +++ b/technology/applications/cli/intermodal.md @@ -1,7 +1,7 @@ --- obj: application repo: https://github.com/casey/intermodal -website: imdl.io +website: https://imdl.io rev: 2025-01-28 --- From 104e3ba3f385b244de4fd2872a5161bb4025bfe8 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Thu, 24 Apr 2025 13:50:34 +0200 Subject: [PATCH 43/99] update rust --- technology/dev/programming/languages/Rust.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/technology/dev/programming/languages/Rust.md b/technology/dev/programming/languages/Rust.md index 108a840..d48ac54 100644 --- a/technology/dev/programming/languages/Rust.md +++ b/technology/dev/programming/languages/Rust.md @@ -231,6 +231,8 @@ fn do_something() { } ``` +> **Note**: If you ever need to guard your code from an overly aggressive `cargo fmt`, you can annotate it with `#[rustfmt::skip]` + ### Modules You can split your code up into multiple modules for better organization. ```rust @@ -1009,6 +1011,9 @@ Currently, all supported targets follow the assembly code syntax used by LLVM's - [serde_json](https://lib.rs/crates/serde_json): A [JSON](../../../files/JSON.md) serialization file format - [serde_jsonc](https://lib.rs/crates/serde_jsonc): A JSON serialization file format - [serde_yaml](https://lib.rs/crates/serde_yaml): [YAML](../../../files/YAML.md) data format for Serde +- [rmp_serde](https://lib.rs/crates/rmp-serde): MsgPack format for serde +- [rmpv](https://lib.rs/crates/rmpv): MsgPack value variants (`serde_json::Value` for MsgPack) +- [rmp](https://lib.rs/crates/rmp): low level msgpack implementation - [bson](https://lib.rs/crates/bson): Encoding and decoding support for [BSON](../../../files/BSON.md) in Rust - [toml](https://lib.rs/crates/toml): A native Rust encoder and decoder of [TOML](../../../files/TOML.md)-formatted files and streams. - [gray_matter](https://lib.rs/crates/gray_matter): Smart front matter parser. An implementation of gray-matter in rust. Parses YAML, JSON, TOML and support for custom parsers. From c9d9127160adc53453f891d4573a3574b2c4d222 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Thu, 24 Apr 2025 14:14:10 +0200 Subject: [PATCH 44/99] add dualsensectl --- .../applications/gaming/dualsensectl.md | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 technology/applications/gaming/dualsensectl.md diff --git a/technology/applications/gaming/dualsensectl.md b/technology/applications/gaming/dualsensectl.md new file mode 100644 index 0000000..b6ed5d8 --- /dev/null +++ b/technology/applications/gaming/dualsensectl.md @@ -0,0 +1,47 @@ +--- +obj: application +repo: https://github.com/nowrep/dualsensectl +--- + +# dualsensectl + +Linux tool for controlling Sony PlayStation 5 DualSense controller. + +## Usage + +Usage: `dualsensectl [options] command [ARGS]` + +### Options + +| Option | Description | +| ----------- | ------------------------------------------------- | +| `-l` | List available devices | +| `-d DEVICE` | Specify which device to use | +| `-w` | Wait for shell command to complete (monitor only) | + +### Commands + +Available Commands: + +- `power-off`: Turn off the controller (BT only), +- `battery`: Get the controller battery level, +- `info`: Get the controller firmware info, +- `lightbar STATE`: Enable (on) or disable (off) lightbar, +- `lightbar RED GREEN BLUE [BRIGHTNESS]`: Set lightbar color and brightness (0-255), +- `player-leds NUMBER`: Set player LEDs (1-5) or disabled (0), +- `microphone STATE`: Enable (on) or disable (off) microphone, +- `microphone-led STATE`: Enable (on) or disable (off) microphone LED, +- `speaker STATE`: Toggle to `internal` speaker, `headphone` or both, +- `volume VOLUME`: Set audio volume (0-255) of internal speaker and headphone, +- `attenuation RUMBLE TRIGGER`: Set the attenuation (0-7) of rumble/haptic motors and trigger vibration, +- `trigger TRIGGER off`: Remove all effects, +- `trigger TRIGGER feedback POSITION STRENGTH`: Set a resistance starting at position with a defined strength, +- `trigger TRIGGER weapon START STOP STRENGTH`: Emulate weapon like gun trigger, +- `trigger TRIGGER bow START STOP STRENGTH SNAPFORCE`: Emulate weapon like bow, +- `trigger TRIGGER galloping START STOP FIRST_FOOT SECOND_FOOT FREQUENCY`: Emulate a galloping, +- `trigger TRIGGER machine START STOP STRENGTH_A STRENGTH_B FREQUENCY PERIOD`: Switch vibration between two strengths at a specified period, +- `trigger TRIGGER vibration POSITION AMPLITUDE FREQUENCY`: Vibrates motor arm around specified position, +- `trigger TRIGGER feedback-raw STRENGTH[10]`: Set a resistance starting using an array of strength, +- `trigger TRIGGER vibration-raw AMPLITUDE[10] FREQUENCY`: Vibrates motor arm at position and strength specified by an array of amplitude, +- `trigger TRIGGER MODE [PARAMS]`: Set the trigger (left, right or both) mode with parameters (up to 9), +- `monitor [add COMMAND] [remove COMMAND]`: Run shell command COMMAND on add/remove events. From 915644451b3e03bfaab18706f55cb876ae3effbb Mon Sep 17 00:00:00 2001 From: JMARyA Date: Thu, 24 Apr 2025 14:14:45 +0200 Subject: [PATCH 45/99] update pacman --- .../applications/package managers/arch-linux/Pacman.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/technology/applications/package managers/arch-linux/Pacman.md b/technology/applications/package managers/arch-linux/Pacman.md index bbaa46e..8795451 100644 --- a/technology/applications/package managers/arch-linux/Pacman.md +++ b/technology/applications/package managers/arch-linux/Pacman.md @@ -36,6 +36,14 @@ pacman -Rcs ... Get information about package: ```shell pacman -Si ... + +# Local +pacman -Qi ... +``` + +List all packages from a reposity: +```shell +pacman -Sl ``` Install a package from local package file (.[tar](../../cli/compression/tar.md).[xz](../../../files/XZ%20Compression.md)): From 1cd71457dd7391231b65e7efa51a9da4ab1a5f56 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Thu, 24 Apr 2025 14:15:55 +0200 Subject: [PATCH 46/99] update ha --- technology/applications/web/Home Assistant.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/technology/applications/web/Home Assistant.md b/technology/applications/web/Home Assistant.md index 92eb884..bc90bec 100644 --- a/technology/applications/web/Home Assistant.md +++ b/technology/applications/web/Home Assistant.md @@ -54,3 +54,6 @@ services: restart: always network_mode: host ``` + +## Extensions +- [Mushroom Cards](https://github.com/piitaya/lovelace-mushroom) From 09ace3edede211dc73e44bcc3de59885ebecc59f Mon Sep 17 00:00:00 2001 From: JMARyA Date: Thu, 24 Apr 2025 14:16:58 +0200 Subject: [PATCH 47/99] add systeroid --- .../applications/utilities/systeroid.md | 357 ++++++++++++++++++ 1 file changed, 357 insertions(+) create mode 100644 technology/applications/utilities/systeroid.md diff --git a/technology/applications/utilities/systeroid.md b/technology/applications/utilities/systeroid.md new file mode 100644 index 0000000..b0d9d39 --- /dev/null +++ b/technology/applications/utilities/systeroid.md @@ -0,0 +1,357 @@ +--- +obj: application +repo: https://github.com/orhun/systeroid +rev: 2025-02-07 +--- + +# systeroid +`sysctl` is a utility on Unix-like operating systems that is used to read and modify the attributes of the kernel such as its version number, maximum limits, and security settings. **systeroid** is "_sysctl on steroids_". It can do everything that sysctl does and even more. It provides a safer, more performant, and user-friendly CLI/TUI for managing the kernel parameters at runtime. + +Although **systeroid** does not need the parameter section to be specified explicitly, it is important to know the sections and their areas of impact. Here are the available kernel sections according to the [Linux kernel documentation](https://www.kernel.org/doc/html/latest/admin-guide/sysctl/index.html): + +| Section | Path | Description | +| ---------- | ------------------- | ------------------------------------------------------------- | +| **abi** | `/proc/sys/abi/` | execution domains & personalities | +| **fs** | `/proc/sys/fs/` | filesystem settings | +| **kernel** | `/proc/sys/kernel/` | global kernel information / miscellaneous settings | +| **net** | `/proc/sys/net/` | networking settings | +| **sunrpc** | `/proc/sys/sunrpc/` | SUN Remote Procedure Call settings | +| **user** | `/proc/sys/user/` | user namespace limits | +| **vm** | `/proc/sys/vm/` | memory management tuning buffer and cache management settings | +| **dev** | `/proc/sys/dev/` | device specific information | +| **debug** | `/proc/sys/debug/` | - | + + +## Usage +``` +systeroid [options] [variable[=value] ...] --load[=] +``` + +### Options +| Option | Description | +| ---------------------- | -------------------------------------------- | +| `-a, --all` | display all variables | +| `-T, --tree` | display the variables in a tree-like format | +| `-J, --json` | display the variables in JSON format | +| `--deprecated` | include deprecated variables while listing | +| `-e, --ignore` | ignore unknown variable errors | +| `-N, --names` | print only variable names | +| `-n, --values` | print only variable values | +| `-b, --binary` | print only variable values without new line | +| `-p, --load` | read values from file | +| `-S, --system` | read values from all system directories | +| `-r, --pattern ` | use a regex for matching variable names | +| `-q, --quiet` | do not print variable after the value is set | +| `-w, --write` | only enable writing a value to variable | +| `-E, --explain` | provide a detailed explanation for variable | +| `-D, --docs ` | set the path of the kernel documentation | +| `-P, --no-pager` | do not pipe output into a pager | +| `-v, --verbose` | enable verbose logging | +| `--tui` | show terminal user interface | +| `-c, --config ` | set the path of the configuration file | + +Most of the arguments/flags are inherited from `sysctl` so they have the same functionality. + +### Examples + +#### Listing parameters + +```sh +# list all parameters +systeroid -A + +# list parameters in a tree-like format +systeroid -T + +# list parameters in JSON format +systeroid -J +``` + +#### Filtering by section + +```sh +# only list parameters in the "kernel" section +systeroid kernel + +# only list parameters in the "vm" and "user" sections +systeroid vm user +``` + +#### Displaying values + +```sh +# print the name and value of a parameter (in "name=value" format) +systeroid kernel.hostname + +# print only the value of a parameter +systeroid -n kernel.hostname + +# print the name and values of the multiple parameters +systeroid kernel.hostname user.max_user_namespaces +``` + +#### Setting values + +```sh +# set the value of a parameter +systeroid kernel.domainname="example.com" + +# set the values of multiple parameters and ignore errors +systeroid -e kernel.dmesg_restrict=0 vm.panic_on_oom=1 unknown_param="test" + +# set the values of multiple parameters and enforce the "name=value" format +systeroid -w fs.dir-notify-enable=1 net.mptcp.enabled=1 vm.oom_kill_allocating_task +``` + +#### Loading values from a file +Parameter values can be set from an [INI file](https://en.wikipedia.org/wiki/INI_file). + +`sysctl.conf`: + +```ini +# Use kernel.sysrq = 1 to allow all keys. +# See https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html for a list +# of values and keys. +kernel.sysrq = 16 + +# Append the PID to the core filename +kernel.core_uses_pid = 1 + +; Enable hard and soft link protection +; (If a line begins with a single '-', any attempts to set the value that fail will be ignored.) +-fs.protected_hardlinks = 1 +fs.protected_symlinks = 1 +``` + +To load it: + +```sh +systeroid --load sysctl.conf +``` + +If no file is given, values are loaded from `/etc/sysctl.conf` as default: + +```sh +systeroid --load +``` + +Specifying "-" as file name means reading data from standard input: + +```sh +systeroid --load - +``` + +#### Loading values from the system directories + +The list of default system directories are the following: + +- `/etc/sysctl.d` +- `/run/sysctl.d` +- `/usr/local/lib/sysctl.d` +- `/usr/lib/sysctl.d` +- `/lib/sysctl.d` +- `/etc/sysctl.conf` + +Use `--system` flag to load the files with `.conf` extension in these directories: + +```sh +systeroid --system +``` + +#### Searching parameters + +```sh +# search parameters using regex patterns +systeroid -r 'net.ipv4.conf.(eth|wlan)0.arp' +systeroid -r '^net.ipv6' +``` + +Example output of combining search with listing: + +```sh +$ systeroid --names --pattern 'kernel.*_max$' --tree + +kernel +├── ngroups_max +├── pid_max +└── sched_util_clamp_max +``` + +#### Showing information about parameters + +**systeroid** can dump the parameter information from the kernel documentation. This is useful if you don't know what a parameter is used for. + +```sh +# show information about a parameter +systeroid --explain oom_dump_tasks +``` + +Kernel documentation should be present in one of the following paths for parsing upon first launch: + +- `/usr/share/doc/linux` +- `/usr/share/doc/linux-doc` +- `/usr/share/doc/linux-docs` +- `/usr/share/doc/kernel-doc-*/Documentation` + +Then the parsed data is cached in `$HOME/.cache/systeroid-core` and used from there as long as the documentation is not updated. The caching mechanism can be disabled via setting the `NO_CACHE` environment variable. + +This is a design choice due to the fact that different versions of kernels might be installed on different systems so the documentation might be too new or old if **systeroid** was to be shipped with a fixed set of parameter descriptions bundled in. With the parsing approach, documentation is always kept up-to-date. + +However, this means you need to: + +- either install the kernel documentation package (based on your distribution) + - on Arch Linux: `pacman -S linux-docs` + - on Debian/Ubuntu: `apt-get install linux-doc` + - on Fedora: `dnf install kernel-doc` +- or explicitly specify the path of the [kernel documentation](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/admin-guide). + +```sh +# specify the kernel documentation path explicitly +# (not needed if you have the kernel documentation installed as a package) +systeroid -E user.max_user_namespaces --docs /usr/share/doc/linux +``` + +To change the default pager (`less(1)`), you can use the `PAGER` environment variable. Also, you can simply use `--no-pager` flag to disable it. + +```sh +systeroid -E kernel.ctrl-alt-del --no-pager +``` + +It is also possible to retrieve information about multiple parameters: + +```sh +systeroid -E --pattern '.*ipv4.*' --no-pager +``` + +#### Verbose logging + +`--verbose` flag can be used to enable verbose logging: + +```sh +systeroid --verbose +``` + +Also, `RUST_LOG` environment variable can be set accordingly to filter based on different log levels. + +```sh +RUST_LOG=trace systeroid +``` + +## TUI + +### Usage + +``` +systeroid-tui [options] +``` + +### Key Bindings + +| Key | Action | +| ---------------------------------------------------------- | ---------------------------- | +| ?, f1 | show help | +| up/down, k/j, pgup/pgdown | scroll list | +| t/b | scroll to top/bottom | +| left/right, h/l | scroll documentation | +| tab, ` | next/previous section | +| : | command | +| / | search | +| enter | select / set parameter value | +| s | save parameter value | +| c | copy to clipboard | +| ctrl-l, f2 | show logs | +| r, f5 | refresh | +| esc | cancel / exit | +| q, ctrl-c/ctrl-d | exit | + +## Configuration +**systeroid** can be configured with a configuration file that uses the [INI format](https://en.wikipedia.org/wiki/INI_file). It can be specified via `--config` or `SYSTEROID_CONFIG` environment variable. It can also be placed in one of the following global locations: + +- `$HOME/.config/systeroid/systeroid.conf` +- `$HOME/.systeroid/systeroid.conf` + +```sh +# set the config path via argument +systeroid --config config/systeroid.conf + +# set the config path via env +SYSTEROID_CONFIG=config/systeroid.conf systeroid + +# use a global path +mkdir -p "$HOME/.config/systeroid" +cp config/systeroid.conf "$HOME/.config/systeroid" +systeroid +``` + +See the example systeroid.conf for the configuration options: + +```ini +; systeroid ~ configuration file +; https://github.com/orhun/systeroid +; +; Each line either contains a comment or a command line argument grouped under a section. +; Run "systeroid --help" or "systeroid-tui --help" to get a list of all possible configuration options. + +[general] +; display the deprecated parameters such as base_reachable_time and retrans_time while listing +; See https://bugzilla.redhat.com/show_bug.cgi?id=152435 +display_deprecated = false +; path of the Linux kernel documentation +; this is distro dependent, systeroid checks the following locations as default: +; - /usr/share/doc/linux/ +; - /usr/share/doc/linux-doc/ +; - /usr/share/doc/linux-docs/ +; - /usr/share/doc/kernel-doc-*/Documentation/ +kernel_docs = "/usr/share/doc/linux" + +[cli] +; ignore unknown variable errors +ignore_errors = true +; do not print variable after the value is set +quiet = false +; do not pipe output into a pager +; note that the default pager is less(1) and you can change it by using `PAGER` environment variable +no_pager = false +; display type for the parameter, available options are: +; - default: print the parameter name along with its value +; - name: print only the name of the parameter +; - value: print only the value of the parameter +; - binary: print only the value of the parameter without new line +display_type = "default" +; output type for the list, available options are: +; - default: print the output as is +; - tree: print the output in a tree-like format +; - json: print the output in JSON format +output_type = "default" + +[cli.colors] +; available colors are defined in https://docs.rs/owo-colors/latest/owo_colors/colored/enum.Color.html +; default color for the symbols +default_color = "bright black" +; section colors +section_abi = "red" +section_fs = "green" +section_kernel = "magenta" +section_net = "blue" +section_sunrpc = "yellow" +section_user = "cyan" +section_vm = "bright red" +section_unknown = "white" + +[tui] +; tick rate of the terminal +tick_rate = 250 +; disable showing the parameter documentation +no_docs = true +; path for saving the changed kernel parameters +save_path = "/etc/sysctl.conf" +; file to save the logs +;log_file = "systeroid.log" + +[tui.colors] +; available colors are defined in https://docs.rs/tui/latest/tui/style/enum.Color.html +; terminal foreground color +fg_color = "white" +; terminal background color +bg_color = "black" +``` From 9639ae7add6c969de043a790b3d2dc7ba06517ff Mon Sep 17 00:00:00 2001 From: JMARyA Date: Fri, 25 Apr 2025 14:17:09 +0200 Subject: [PATCH 48/99] add onefetch --- .../applications/development/onefetch.md | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 technology/applications/development/onefetch.md diff --git a/technology/applications/development/onefetch.md b/technology/applications/development/onefetch.md new file mode 100644 index 0000000..9e68d43 --- /dev/null +++ b/technology/applications/development/onefetch.md @@ -0,0 +1,52 @@ +--- +obj: application +repo: https://github.com/o2sh/onefetch +rev: 2025-02-07 +--- + +# onefetch +Onefetch is a command-line Git information tool written in Rust that displays project information and code statistics for a local Git repository directly to your terminal. The tool is completely offline - no network access is required. + +By default, the repo's information is displayed alongside the dominant language's logo, but you can further configure onefetch to instead use an image - on supported terminals -, a text input or nothing at all. + +It automatically detects open source licenses from texts and provides the user with valuable information like code distribution, pending changes, number of dependencies (by package manager), top contributors (by number of commits), size on disk, creation date, LOC (lines of code), etc. + +Onefetch can be configured via command-line flags to display exactly what you want, the way you want it to: you can customize ASCII/Text formatting, disable info lines, ignore files & directories, output in multiple formats, etc. + +## Usage +Usage: `onefetch [OPTIONS] [INPUT]` + +| Option | Description | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-d`, `--disabled-fields ...` | Allows you to disable FIELD(s) from appearing in the output | +| `--no-title` | Hides the title | +| `--number-of-authors ` | Maximum NUM of authors to be shown [default: 3] | +| `--number-of-languages ` | Maximum NUM of languages to be shown [default: 6] | +| `--number-of-file-churns ` | Maximum NUM of file churns to be shown [default: 3] | +| `--churn-pool-size ` | Minimum NUM of commits from HEAD used to compute the churn summary. By default, the value is non-deterministic due to time-based computation and will be displayed under the info title "Churn (NUM)" | +| `-e`, `--exclude ...` | Ignore all files & directories matching EXCLUDE | +| `--no-bots[=]` | Exclude bot commits. Use `` to override the default pattern | +| `--no-merges` | Ignores merge commits | +| `-E`, `--email` | Show the email address of each author | +| `--http-url` | Display repository URL as HTTP | +| `--hide-token` | Hide token in repository URL | +| `--include-hidden` | Count hidden files and directories | +| `-T`, `--type ...` | Filters output by language type [default: programming markup] [possible values: programming, markup, prose, data] | +| `-t`, `--text-colors ...` | Changes the text colors (X X X...). Goes in order of title, ~, underline, subtitle, colon, and info | +| `-z`, `--iso-time` | Use ISO 8601 formatted timestamps | +| `--number-separator ` | Which thousands SEPARATOR to use [default: plain] [possible values: plain, comma, space, underscore] | +| `--no-bold` | Turns off bold formatting | +| `--ascii-input ` | Takes a non-empty STRING as input to replace the ASCII logo | +| `-c`, `--ascii-colors ...` | Colors (X X X...) to print the ascii art | +| `-a`, `--ascii-language ` | Which LANGUAGE's ascii art to print | +| `--true-color ` | Specify when to use true color [default: auto] [possible values: auto, never, always] | +| `-i`, `--image ` | Path to the IMAGE file | +| `--image-protocol ` | Which image PROTOCOL to use [possible values: kitty, sixel, iterm] | +| `--color-resolution ` | VALUE of color resolution to use with SIXEL backend [default: 16] [possible values: 16, 32, 64, 128, 256] | +| `--no-color-palette` | Hides the color palette | +| `--no-art` | Hides the ascii art or image if provided | +| `--nerd-fonts` | Use Nerd Font icons. Replaces language chips with Nerd Font icons | +| `-o`, `--output ` | Outputs Onefetch in a specific format [possible values: json, yaml] | +| `--generate ` | If provided, outputs the completion file for given SHELL [possible values: bash, elvish, fish, powershell, zsh] | +| `-l`, `--languages` | Prints out supported languages | +| `-p`, `--package-managers` | Prints out supported package managers | From 8212f6595725c4786afca5afc21de048f1033e2b Mon Sep 17 00:00:00 2001 From: JMARyA Date: Fri, 2 May 2025 13:21:07 +0200 Subject: [PATCH 49/99] update rust crypto crates --- technology/dev/programming/languages/Rust.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/technology/dev/programming/languages/Rust.md b/technology/dev/programming/languages/Rust.md index d48ac54..27ed117 100644 --- a/technology/dev/programming/languages/Rust.md +++ b/technology/dev/programming/languages/Rust.md @@ -1062,6 +1062,8 @@ Currently, all supported targets follow the assembly code syntax used by LLVM's - [redact](https://lib.rs/crates/redact): A simple library for keeping secrets out of logs - [noise](https://lib.rs/crates/noise): Procedural noise generation library - [ulid](https://lib.rs/crates/ulid): a Universally Unique Lexicographically Sortable Identifier implementation +- [age](https://crates.io/crates/age): A simple, secure, and modern encryption library. +- [minisign](https://crates.io/crates/minisign): A crate to sign files and verify signatures. #### Hashes - [digest](https://lib.rs/crates/digest): Traits for cryptographic hash functions and message authentication codes From 8386d56c383ce2e827e098bf728c01b40f757ef0 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Fri, 2 May 2025 13:21:30 +0200 Subject: [PATCH 50/99] add minisign --- technology/cryptography/minisign.md | 139 ++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 technology/cryptography/minisign.md diff --git a/technology/cryptography/minisign.md b/technology/cryptography/minisign.md new file mode 100644 index 0000000..9d3ff90 --- /dev/null +++ b/technology/cryptography/minisign.md @@ -0,0 +1,139 @@ +--- +obj: application +website: https://jedisct1.github.io/minisign +repo: https://github.com/jedisct1/minisign +--- + +# minisign +Minisign is a dead simple tool to sign files and verify signatures. There is also an [implementation in Rust](https://github.com/jedisct1/rsign2). +It is portable, lightweight, and uses the highly secure Ed25519 public-key signature system. + +## Creating a key pair +```shell +$ minisign -G +``` + +The public key is printed and put into the `minisign.pub` file. The secret key is encrypted and saved as a file named `~/.minisign/minisign.key`. + +## Signing a file +```shell +$ minisign -Sm myfile.txt +``` + +Or to include a comment in the signature, that will be verified and displayed when verifying the file: +```shell +$ minisign -Sm myfile.txt -t 'This comment will be signed as well' +``` + +The signature is put into `myfile.txt.minisig`. + +Multiple files can also be signed at once: +```shell +$ minisign -Sm file1.txt file2.txt *.jpg +``` + +## Verifying a file +```shell +$ minisign -Vm myfile.txt -P RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3 +``` + +or + +```shell +$ minisign -Vm myfile.txt -p signature.pub +``` + +This requires the signature `myfile.txt.minisig` to be present in the same directory. + +The public key can either reside in a file (`./minisign.pub` by default) or be directly specified on the command line. + +## Usage +``` +Usage: +minisign -G [-f] [-p pubkey_file] [-s seckey_file] [-W] +minisign -R [-s seckey_file] [-p pubkey_file] +minisign -C [-s seckey_file] [-W] +minisign -S [-l] [-x sig_file] [-s seckey_file] [-c untrusted_comment] [-t trusted_comment] -m file [file ...] +minisign -V [-H] [-x sig_file] [-p pubkey_file | -P pubkey] [-o] [-q] -m file +``` + +| Option | Description | +|--------------|-----------------------------------------------------------------------| +| `-G` | Generate a new key pair | +| `-R` | Recreate a public key file from a secret key file | +| `-C` | Change/remove the password of the secret key | +| `-S` | Sign files | +| `-V` | Verify that a signature is valid for a given file | +| `-H` | Require input to be prehashed | +| `-l` | Sign using the legacy format | +| `-m ` | File to sign/verify | +| `-o` | Combined with `-V`, output the file content after verification | +| `-p ` | Public key file (default: `./minisign.pub`) | +| `-P `| Public key, as a base64 string | +| `-s ` | Secret key file (default: `~/.minisign/minisign.key`) | +| `-W` | Do not encrypt/decrypt the secret key with a password | +| `-x `| Signature file (default: `.minisig`) | +| `-c `| Add a one-line untrusted comment | +| `-t `| Add a one-line trusted comment | +| `-q` | Quiet mode, suppress output | +| `-Q` | Pretty quiet mode, only print the trusted comment | +| `-f` | Force. Combined with `-G`, overwrite a previous key pair | +| `-v` | Display version number | + +### Trusted comments +Signature files include an untrusted comment line that can be freely modified even after the signature is created. + +They also include a second comment line that cannot be modified without the secret key. + +Trusted comments can be used to add instructions or application-specific metadata such as the intended file name, timestamps, resource identifiers, or version numbers to prevent downgrade attacks. + +OpenBSD's signify is conceptually similar to Minisign. + +Minisign creates signatures that can be verified by signify; however, signatures created by signify cannot be verified with Minisign because Minisign expects a trusted comment section to be present. +Trusted comments are crucial for describing what has been signed, in addition to merely confirming that a signature exists. + +## Signature format +``` +untrusted comment: +base64( || || ) +trusted_comment: +base64() +``` + +- `signature_algorithm`: `Ed` (legacy) or `ED` (hashed) +- `key_id`: 8 random bytes, matching the public key +- `signature` (legacy): `ed25519()` +- `signature` (prehashed): `ed25519(Blake2b-512())` +- `global_signature`: `ed25519( || )` + +New implementations must use the hashed signature format; support for the legacy one is optional and should not be done by default. + +## Public key format +``` +untrusted comment: +base64( || || ) +``` + +- `signature_algorithm`: `Ed` +- `key_id`: 8 random bytes +- `public_key`: Ed25519 public key + + +## Secret key format +``` +untrusted comment: +base64( || || || + || || || ) +``` + +- `signature_algorithm`: `Ed` +- `kdf_algorithm`: `Sc` +- `cksum_algorithm`: `B2` +- `kdf_salt`: 32 random bytes +- `kdf_opslimit`: `crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_SENSITIVE` +- `kdf_memlimit`: `crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_SENSITIVE` +- `keynum_sk`: ` ^ ( || || || )`, 104 bytes +- `key_id`: 8 random bytes +- `secret_key`: Ed25519 secret key +- `public_key`: Ed25519 public key +- `checksum`: `Blake2b-256( || || || )`, 32 bytes From 9a062cbfed2ec792392f6052d1a3df273b5e16b1 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Fri, 2 May 2025 13:25:35 +0200 Subject: [PATCH 51/99] add panamax --- technology/applications/web/panamax.md | 136 +++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 technology/applications/web/panamax.md diff --git a/technology/applications/web/panamax.md b/technology/applications/web/panamax.md new file mode 100644 index 0000000..021be1e --- /dev/null +++ b/technology/applications/web/panamax.md @@ -0,0 +1,136 @@ +--- +obj: application +repo: https://github.com/panamax-rs/panamax +--- + +# Panamax +Panamax is a tool to mirror the Rust and crates.io repositories, for offline usage of `rustup` and `cargo`. + +## Usage +## Docker +Panamax is available as a docker image, so you can run: + +``` +$ docker run --rm -it -v /path/to/mirror/:/mirror --user $(id -u) panamaxrs/panamax init /mirror +(Modify /path/to/mirror/mirror.toml as needed) +$ docker run --rm -it -v /path/to/mirror/:/mirror --user $(id -u) panamaxrs/panamax sync /mirror +(Once synced, serve the mirror) +$ docker run --rm -it -v /path/to/mirror/:/mirror --user $(id -u) -p8080:8080 panamaxrs/panamax serve /mirror +``` + +Alternatively, you can run panamax in a bare-metal environment like below. + +### Init +In Panamax, mirrors consist of self-contained directories. To create a mirror directory `my-mirror`: + +``` +$ panamax init my-mirror +Successfully created mirror base at `my-mirror`. +Make any desired changes to my-mirror/mirror.toml, then run panamax sync my-mirror. +``` + +There will now be a `my-mirror` directory in your current directory. + +### Modify mirror.toml +Within the directory, you'll find a `mirror.toml` file. This file contains the full configuration of the mirror, and while it has sane defaults, you should ensure the values are set to what you want. + +The other important parameter to set is the `base_url` within the `[crates]` section. After `cargo` fetches the index, it will try to use this URL to actually download the crates. It's important this value is accurate, or `cargo` may not work with the mirror. + +You can modify `mirror.toml` at any point in time, even after the mirror is synchronized. + +### Sync +Once you have made the changes to `mirror.toml`, it is time to synchronize your mirror! + +``` +$ panamax sync my-mirror +Syncing Rustup repositories... +[1/5] Syncing rustup-init files... ██████████████████████████████████████████████████████████████ 27/27 [00:00:06] +[2/5] Syncing latest stable... ████████████████████████████████████████████████████████████ 602/602 [00:09:02] +[3/5] Syncing latest beta... ████████████████████████████████████████████████████████████ 524/524 [00:07:29] +[4/5] Syncing latest nightly... ████████████████████████████████████████████████████████████ 546/546 [00:08:56] +[5/5] Cleaning old files... ████████████████████████████████████████████████████████████ 546/546 [00:00:00] +Syncing Rustup repositories complete! +Syncing Crates repositories... +[1/3] Fetching crates.io-index... ██████████████████████████████████████████████████████████ 1615/1615 [00:00:02] +[2/3] Syncing crates files... ██████████████████████████████████████████████████████████ 6357/6357 [00:00:05] +[3/3] Syncing index and config... +Syncing Crates repositories complete! +Sync complete. +``` + +Once this is step completes (without download errors), you will now have a full, synchronized copy of all the files needed to use `rustup` and `cargo` to their full potential! + +This directory can now be copied to a USB or rsync'd somewhere else, or even used in place - perfect for long plane trips! + +Additionally, this mirror can continually by synchronized in the future - one recommendation is to run this command in a cronjob once each night, to keep the mirror reasonably up to date. + +### Sync Select Dependencies +Optionally, panamax can be told to only grab crates needed to build a singular project. +`cargo vendor` is used to create a folder with all needed dependencies, +then a panamax command can parse the created directory and only grab those crates and versions. +``` +# Only grab crates needed for panamax, as an example +$ cargo vendor +$ panamax sync my-mirror vendor +``` + +## Server +Panamax provides a warp-based HTTP(S) server that can handle serving a Rust mirror fast and at scale. This is the recommended way to serve the mirror. + +``` +$ panamax serve my-mirror +Running HTTP on [::]:8080 +``` + +The server's index page provides all the instructions needed on how to set up a Rust client that uses this mirror. + +If you would prefer having these instructions elsewhere, the rest of this README will describe the setup process in more detail. + +Additionally, if you would prefer hosting a server with nginx, there is a sample nginx configuration in the repository, at `nginx.sample.conf`. + +## Configuring `rustup` and `cargo` +Once you have a mirror server set up and running, it's time to tell your Rust components to use it. + +### Setting environment variables +In order to ensure `rustup` knows where to look for the Rust components, we need to set some environment variables. Assuming the mirror is hosted at http://panamax.internal/: + +``` +export RUSTUP_DIST_SERVER=http://panamax.internal +export RUSTUP_UPDATE_ROOT=http://panamax.internal/rustup +``` + +These need to be set whenever `rustup` is used, so these should be added to your `.bashrc` file (or equivalent). + +### Installing `rustup` +If you already have `rustup` installed, this step isn't necessary, however if you don't have access to https://rustup.rs, the mirror also contains the `rustup-init` files needed to install `rustup`. + +Assuming the mirror is hosted at http://panamax.internal/, you will find the `rustup-init` files at http://panamax.internal/rustup/dist/. The `rustup-init` file you want depends on your architecture. Assuming you're running desktop Linux on a 64-bit machine: + +``` +wget http://panamax.internal/rustup/dist/x86_64-unknown-linux-gnu/rustup-init +chmod +x rustup-init +./rustup-init +``` + +This will let you install `rustup` the similarly following the steps from https://rustup.rs. This will also let you use `rustup` to keep your Rust installation updated in the future. + +### Configuring `cargo` +`Cargo` also needs to be configured to point to the mirror. This can be done by adding the following lines to `~/.cargo/config` (creating the file if it doesn't exist): + +``` +[source.my-mirror] +registry = "http://panamax.internal/crates.io-index" +[source.crates-io] +replace-with = "my-mirror" +``` + +`Cargo` should now be pointing to the correct location to use the mirror. + +### Testing configuration +You've now set up a Rust mirror! In order to make sure everything is set up properly, you can run a simple test: + +``` +$ cargo install ripgrep +``` + +This will install the grep-like `rg` tool (which is a great tool - props to burntsushi!). If `cargo` successfully downloads and builds everything, you have yourself a working mirror. Congratulations! From 8801263318f739ef6d1a85876b01a4be04b3e3b2 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Fri, 2 May 2025 13:32:04 +0200 Subject: [PATCH 52/99] add metadata-cli --- technology/applications/media/metadata-cli.md | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 technology/applications/media/metadata-cli.md diff --git a/technology/applications/media/metadata-cli.md b/technology/applications/media/metadata-cli.md new file mode 100644 index 0000000..e599b26 --- /dev/null +++ b/technology/applications/media/metadata-cli.md @@ -0,0 +1,53 @@ +--- +obj: application +repo: https://github.com/zmwangx/metadata +--- + +# metadata +`metadata` is a media metadata parser and formatter designed for human consumption. Powered by FFmpeg. + +Example: + +``` +$ metadata '20160907 Apple Special Event.m4v' +Title: Apple Special Event, September 2016 (1080p) +Filename: 20160907 Apple Special Event.m4v +File size: 6825755188 (6.83GB, 6.36GiB) +Container format: MPEG-4 Part 14 (M4V) +Duration: 01:59:15.88 +Pixel dimensions: 1920x800 +Sample aspect ratio: 1:1 +Display aspect ratio: 12:5 +Scan type: Progressive scan* +Frame rate: 29.97 fps +Bit rate: 7631 kb/s + #0: Video, H.264 (High Profile level 4), yuv420p, 1920x800 (SAR 1:1, DAR 12:5), 29.97 fps, 7500 kb/s + #1: Audio (und), AAC (LC), 48000 Hz, stereo, 125 kb/s + #2: Subtitle (eng), EIA-608 closed captions + +``` + +Compare this to `ffprobe` or `mediainfo` (both great tools, just not so human-readable): + +## Usage +``` +$ metadata -h +metadata 0.1.4 +Zhiming Wang +Media file metadata for human consumption. + +USAGE: + metadata [FLAGS] ... + +FLAGS: + -A, --all-tags Print all metadata tags + -c, --checksum Include file checksum(s) + -h, --help Prints help information + -s, --scan Decode frames to determine scan type (slower, but determines interlaced more accurately; see man + page for details) + -t, --tags Print metadata tags, except mundane ones + -V, --version Prints version information + +ARGS: + ... Media file(s) +``` From 42f42773f8d63d3d29aca2db7b08a566fc0caba6 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Fri, 2 May 2025 13:48:31 +0200 Subject: [PATCH 53/99] add delta --- technology/applications/development/delta.md | 151 +++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 technology/applications/development/delta.md diff --git a/technology/applications/development/delta.md b/technology/applications/development/delta.md new file mode 100644 index 0000000..220e571 --- /dev/null +++ b/technology/applications/development/delta.md @@ -0,0 +1,151 @@ +--- +obj: application +website: https://dandavison.github.io/delta/ +repo: https://github.com/dandavison/delta +--- + +# Delta +A syntax-highlighting pager for git, diff, grep, and blame output + +## Get started +Install delta and add this to your `~/.gitconfig`: + +```ini +[core] + pager = delta + +[interactive] + diffFilter = delta --color-only + +[delta] + navigate = true # use n and N to move between diff sections + + # delta detects terminal colors automatically; set one of these to disable auto-detection + # dark = true + # light = true + +[merge] + conflictstyle = zdiff3 +``` + +### Configuration +Delta uses git config (`~/.gitconfig`) for its configuration. + +You do not even need to use git -- delta accepts git diff and unified diff formats and hence works with e.g. mercurial and jujutsu -- but you do need to use the git config format. + +Use `delta --help` to see all the available options. + +To change your delta options in a one-off git command, use `git -c`. For example + +```shell +git -c delta.line-numbers=false show +``` + +## Usage +The main way to use delta is to configure it as the pager for git. + +Delta can also be used as a shorthand for diffing two files, even if they are not in a git repo: the following two commands do the same thing: + +```shell +delta /somewhere/a.txt /somewhere/else/b.txt + +git diff /somewhere/a.txt /somewhere/else/b.txt +``` + +You can also use process substitution shell syntax with delta, e.g. + +```bash +delta <(sort file1) <(sort file2) +``` + +In addition to git output, delta handles standard unified diff format, e.g. `diff -u a.txt b.txt | delta`. + +For Mercurial, you can add delta, with its command line options, to the `[pager]` section of `.hgrc`. + +### Choosing colors (styles) +Delta detects your terminal background color automatically and chooses appropriate default colors. To override automatic detection use dark or light, e.g. + +```ini +[delta] + dark = true +``` + +This is necessary when running delta in some contexts such as lazygit or zellij. + +### Line numbers + +```ini +[delta] + line-numbers = true +``` + +The numbers are displayed in two columns and there are several configuration options: see the `LINE NUMBERS` section in `delta --help` for details. + +### Hyperlinks +Delta uses terminal hyperlinks to turn line numbers, file paths, commit hashes, etc into clickable links, as long as your terminal emulator supports it. Enable the feature with + +```ini +[delta] + hyperlinks = true +``` + +Commit hashes link to GitHub/GitLab/Bitbucket (use `hyperlinks-commit-link-format` for full control). + +The links on line numbers (in grep output, as well as diffs) are particularly interesting: with a little bit of effort, they can be made to open your editor or IDE at the correct line. Use `hyperlinks-file-link-format` to construct the correct URL for your system. For VSCode and JetBrains IDEs this is easy, since they support their own special URL protocols. Here are examples: + +```ini +[delta] + hyperlinks = true + hyperlinks-file-link-format = "vscode://file/{path}:{line}" + # hyperlinks-file-link-format = "idea://open?file={path}&line={line}" + # hyperlinks-file-link-format = "pycharm://open?file={path}&line={line}" +``` + +Zed also supports its own URL protocol, and probably others. + +If your editor does not have its own URL protocol, then there are still many possibilities, although they may be more work. + +The easiest is probably to write a toy HTTP server (e.g. in Python) that opens the links in the way that you need. Then your delta config would look something like + +```ini +[delta] +hyperlinks = true +hyperlinks-file-link-format = "http://localhost:8000/open-in-editor?path={path}&line={line}" +# Now write an HTTP server that handles those requests by opening your editor at the file and line +``` + +### Side-by-side view + +```ini +[delta] + side-by-side = true +``` + +By default, side-by-side view has line-numbers activated, and has syntax highlighting in both the left and right panels. + +### Grep +Delta applies syntax-highlighting and other enhancements to standard grep output such as from ripgrep (aka rg), git grep, grep, etc. If you don't need special features of git grep, then for best results pipe `rg --json` output to delta: this avoids parsing ambiguities that are inevitable with the output of git grep and grep. To customize the colors and syntax highlighting, see the `grep-*` options in `delta --help`. + +Note that git grep can display the "function context" for matches and that delta handles this output specially: see the `-p` and `-W` options of git grep. + +```shell +rg --json -C 2 handle | delta +``` + +With hyperlinks enabled, the line numbers in the grep output will be clickable links. See hyperlinks. + +### Navigation keybindings for large diffs +Use the `navigate` feature to activate navigation keybindings. In this mode, pressing `n` will jump forward to the next file in the diff, and `N` will jump backwards. If you are viewing multiple commits (e.g. via `git log -p`) then navigation will also visit commit boundaries. + +### Merge conflicts +Consider setting `merge.conflictStyle` to `zdiff3`: + +```ini +[merge] + conflictStyle = zdiff3 +``` + +With that setting, when a merge conflict is encountered, Git will display merge conflicts with the contents of the merge base as well. delta will then display this as two diffs, from the ancestor to each side of the conflict: + +### Git blame +Set delta as the pager for blame in the `[pager]` section of your gitconfig. If hyperlinks is enabled in the `[delta]` section then each blame commit will link to the commit on GitHub/GitLab/Bitbucket/etc. From c9491ca90e1899829c693683bbf54b524e08d991 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Fri, 2 May 2025 13:54:21 +0200 Subject: [PATCH 54/99] add lrclib --- technology/internet/websites/Links.md | 1 + technology/internet/websites/clearnet/lrclib.net.md | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 technology/internet/websites/clearnet/lrclib.net.md diff --git a/technology/internet/websites/Links.md b/technology/internet/websites/Links.md index d64b7f9..995860f 100644 --- a/technology/internet/websites/Links.md +++ b/technology/internet/websites/Links.md @@ -50,6 +50,7 @@ rev: 2024-03-07 - [SoundCloud](clearnet/SoundCloud.md) - [Nyaa](clearnet/Nyaa.md) - [BS.to](clearnet/BS.to.md) +- [lrclib](clearnet/lrclib.net.md) ## images - [SteamGridDB](clearnet/SteamGridDB.md) diff --git a/technology/internet/websites/clearnet/lrclib.net.md b/technology/internet/websites/clearnet/lrclib.net.md new file mode 100644 index 0000000..feac9bc --- /dev/null +++ b/technology/internet/websites/clearnet/lrclib.net.md @@ -0,0 +1,8 @@ +--- +obj: website +website: https://lrclib.net +category: content +--- + +# lrclib +lrclib.net is a website and API hosting `.lrc` lyric files. From 4c694d4500ea8d9d9fe0be7a37d71c6d8a898a3a Mon Sep 17 00:00:00 2001 From: JMARyA Date: Sun, 11 May 2025 08:22:39 +0200 Subject: [PATCH 55/99] add stalwart --- technology/applications/web/stalwart.md | 28 +++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 technology/applications/web/stalwart.md diff --git a/technology/applications/web/stalwart.md b/technology/applications/web/stalwart.md new file mode 100644 index 0000000..51b5284 --- /dev/null +++ b/technology/applications/web/stalwart.md @@ -0,0 +1,28 @@ +--- +obj: application +website: https://stalw.art +repo: https://github.com/stalwartlabs/mail-server +--- + +# Stalwart Mail +Stalwart Mail Server is an open-source mail server solution with JMAP, IMAP4, POP3, and SMTP support and a wide range of modern features. It is written in Rust and designed to be secure, fast, robust and scalable. + +## Compose +```yml +services: + mail-server: + ports: + - 443:443 + - 9683:8080 + - 25:25 + - 587:587 + - 465:465 + - 143:143 + - 993:993 + - 4190:4190 + - 110:110 + - 995:995 + volumes: + - /nvme/docker/system/stalwart/data:/opt/stalwart-mail + image: stalwartlabs/mail-server:latest +``` From 78bec898a1a02a5823b29a972114bb4e02e7b7db Mon Sep 17 00:00:00 2001 From: JMARyA Date: Sun, 11 May 2025 09:04:59 +0200 Subject: [PATCH 56/99] add spectacle --- technology/applications/desktops/spectacle.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 technology/applications/desktops/spectacle.md diff --git a/technology/applications/desktops/spectacle.md b/technology/applications/desktops/spectacle.md new file mode 100644 index 0000000..06d8b88 --- /dev/null +++ b/technology/applications/desktops/spectacle.md @@ -0,0 +1,12 @@ +--- +obj: application +repo: https://invent.kde.org/graphics/spectacle +website: https://apps.kde.org/de/spectacle +--- + +# Spectacle +Spectacle is a screenshot taking utility for the KDE desktop. + +## Features +- Screenshot region, windows, displays +- Screenrecord From 1a66742bb4bab90f3b2ea1c2bd88826f6c48aa77 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 12 May 2025 09:17:07 +0200 Subject: [PATCH 57/99] add skate --- technology/applications/cli/skate.md | 58 ++++++++++++++++++++++++++ technology/applications/cli/skate.png | Bin 0 -> 246858 bytes 2 files changed, 58 insertions(+) create mode 100644 technology/applications/cli/skate.md create mode 100644 technology/applications/cli/skate.png diff --git a/technology/applications/cli/skate.md b/technology/applications/cli/skate.md new file mode 100644 index 0000000..5720389 --- /dev/null +++ b/technology/applications/cli/skate.md @@ -0,0 +1,58 @@ +--- +obj: application +repo: https://github.com/charmbracelet/skate +--- + +# 🛼 skate +A personal key-value store. + +![Image](./skate.png) + +## Usage +Usage: `skate [command]` + +### KeyValues +Set a value for a key with an optional `@` db. If `VALUE` is omitted, read value from the standard input: +```sh +# Usage: skate set KEY[@DB] [VALUE] [flags] + +skate set foo@mydb bar +skate set foo < ./bar.txt +``` + +Get a value for a key with an optional `@` db: +```shell +# Usage: skate get KEY[@DB] +skate get foo@mydb +``` + +Delete a key with an optional `@` db: +```shell +# Usage: skate delete KEY[@DB] +skate delete foo@mydb +``` + +List key value pairs with an optional `@` db: +```shell +# Usage: skate list [@DB] [flags] + +# Options: +# -d, --delimiter string delimiter to separate keys and values (default "\t") +# -k, --keys-only only print keys and don't fetch values from the db +# -r, --reverse list in reverse lexicographic order +# -b, --show-binary print binary values +# -v, --values-only only print values + +skate list @mydb +``` + +### Databases +List databases: +```shell +skate list-dbs +``` + +Delete a database: +```shell +skate delete-db @mydb +``` diff --git a/technology/applications/cli/skate.png b/technology/applications/cli/skate.png new file mode 100644 index 0000000000000000000000000000000000000000..04996a933134e7a0f5665ac84bbf2e7f2b64da78 GIT binary patch literal 246858 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 Date: Tue, 13 May 2025 10:13:05 +0200 Subject: [PATCH 58/99] add auto-palette --- .../applications/media/auto-palette-cli.md | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 technology/applications/media/auto-palette-cli.md diff --git a/technology/applications/media/auto-palette-cli.md b/technology/applications/media/auto-palette-cli.md new file mode 100644 index 0000000..5286d6f --- /dev/null +++ b/technology/applications/media/auto-palette-cli.md @@ -0,0 +1,96 @@ +--- +obj: application +repo: https://github.com/t28hub/auto-palette +--- + +# auto-palette +🎨 `auto-palette` is a library that automatically extracts prominent color palettes from images, available as Rust library, WebAssembly and CLI tool. + +## Overview +`auto-palette` is a Rust project that offers color palette extraction from images. It consists of the following components: + +* `auto-palette`: Core library for programmatic usage. +* `auto-palette-cli`: Command-line interface for easy usage. +* `auto-palette-wasm`: WebAssembly version for browser usage. + +Perfect for developers, designers and anyone needing efficient color palette extraction. + +## Features +* Automatically extracts prominent color palettes from images. +* Provides detailed color swatch information (color, position, population) +* Supports multiple extraction algorithms: `DBSCAN`, `DBSCAN++`, and `KMeans++`. +* Supports numerous color spaces: `RGB`, `HSL`, `LAB`, `LCHuv`, `ANSI256` and more. +* Theme-based swatch selection: `Colorful`, `Vivid`, `Muted`, `Light`, and `Dark`. +* Available as a Rust library, Wasm, and a CLI tool. + +## Installation +### Rust Library +To use `auto-palette` in your Rust project, add it to your `Cargo.toml`. + +```toml +[dependencies] +auto-palette = "0.8.0" +``` + +### CLI Tool +To use command-line interface, install the `auto-palette-cli` crate. + +```sh +cargo install auto-palette-cli +``` + +## Usage +### Rust Example +Here is an example of extracting the color palette from an image using the Rust library. + +```rust +use auto_palette::{ImageData, Palette}; + +fn main() { + // Load the image data from the file + let image_data = ImageData::load("tests/assets/holly-booth-hLZWGXy5akM-unsplash.jpg").unwrap(); + + // Extract the color palette from the image data + let palette: Palette = Palette::extract(&image_data).unwrap(); + println!("Extracted {} swatches", palette.len()); + + // Find the 5 dominant colors in the palette and print their information + let swatches = palette.find_swatches(5).unwrap(); + for swatch in swatches { + println!("Color: {}", swatch.color().to_hex_string()); + println!("Position: {:?}", swatch.position()); + println!("Population: {}", swatch.population()); + println!("Ratio: {}", swatch.ratio()); + } +} +``` + +### CLI Example +Here is an example of extracting the color palette from an image using the CLI tool. + +```sh +# Usage: auto-palette [OPTIONS] [PATH] +$ auto-palette path/to/your_image.jpg -n 6 -c rgb -o table ++---+--------------------+------------+------------+ +| # | Color | Position | Population | ++---+--------------------+------------+------------+ +| 1 | RGB(221, 226, 222) | (104, 96) | 6778 | +| 2 | RGB(3, 144, 149) | (114, 201) | 5476 | +| 3 | RGB(23, 37, 36) | (120, 300) | 4300 | +| 4 | RGB(36, 88, 131) | (183, 145) | 1348 | +| 5 | RGB(254, 29, 44) | (183, 190) | 779 | +| 6 | RGB(253, 213, 116) | (25, 158) | 567 | ++---+--------------------+------------+------------+ +``` + +#### Options + +| Option | Description | +| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-a, --algorithm ` | Algorithm for extracting the color palette.

**Default:** `dbscan`

**Possible values:**
- `dbscan`: High accuracy but slower speed. Ideal for precision over performance.
- `dbscan++`: A balanced algorithm with faster speed and good accuracy.
- `kmeans`: Fast speed but potentially less accurate. Ideal for performance over precision. | +| `-t, --theme ` | Theme for selecting the swatches.

**Possible values:**
- `colorful`: Prioritize colorful colors.
- `vivid`: Prioritize saturated colors.
- `muted`: Prioritize desaturated colors.
- `light`: Prioritize light colors.
- `dark`: Prioritize dark colors. | +| `-n, --count ` | Number of colors to extract.

**Default:** `5` | +| `-c, --color ` | Output color format.

**Default:** `hex`

**Possible values:**
- `hex`, `rgb`, `cmyk`, `hsl`, `hsv`, `lab`, `luv`, `lchab`, `lchuv`, `oklab`, `oklch`, `xyz` | +| `-o, --output ` | Output format.

**Default:** `text`

**Possible values:**
- `json`, `text`, `table` | +| `--no-resize` | Disable image resizing before extracting the color palette. May improve accuracy by preserving original image resolution. | +| `--clipboard` | Get image from system clipboard. | From dc924e9c1dd0320f4115cbc2f656d86bffd07191 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 19 May 2025 13:49:17 +0200 Subject: [PATCH 59/99] add lemmy --- technology/applications/web/lemmy.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 technology/applications/web/lemmy.md diff --git a/technology/applications/web/lemmy.md b/technology/applications/web/lemmy.md new file mode 100644 index 0000000..686f365 --- /dev/null +++ b/technology/applications/web/lemmy.md @@ -0,0 +1,9 @@ +--- +obj: application +repo: https://github.com/LemmyNet/lemmy +website: https://join-lemmy.org +rev: 2025-05-19 +--- + +# Lemmy +**Lemmy** is an open-source, decentralized, and federated alternative to platforms like Reddit. It allows users to create, share, and discuss content in community-based forums called *communities*. Unlike Reddit, Lemmy is part of the **Fediverse**—a network of interconnected servers (also known as *instances*) that communicate using the **ActivityPub** protocol. From 01ef9a0b18705b415a1ab49acba5889b76f7ff62 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 19 May 2025 13:52:03 +0200 Subject: [PATCH 60/99] add stump --- technology/applications/web/stump.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 technology/applications/web/stump.md diff --git a/technology/applications/web/stump.md b/technology/applications/web/stump.md new file mode 100644 index 0000000..672ac13 --- /dev/null +++ b/technology/applications/web/stump.md @@ -0,0 +1,8 @@ +--- +obj: application +website: https://www.stumpapp.dev +repo: https://github.com/stumpapp/stump +--- + +# Stump +Stump is a free and open source comics, manga and digital book server with OPDS support. From bff33f063b5f94730c0dc2744cb8649b44585139 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 19 May 2025 13:54:21 +0200 Subject: [PATCH 61/99] add octopi --- technology/applications/utilities/octopi.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 technology/applications/utilities/octopi.md diff --git a/technology/applications/utilities/octopi.md b/technology/applications/utilities/octopi.md new file mode 100644 index 0000000..79608ff --- /dev/null +++ b/technology/applications/utilities/octopi.md @@ -0,0 +1,8 @@ +--- +obj: application +repo: https://github.com/aarnt/octopi +--- + +# Octopi +Octopi is a graphical user interface for the Arch Linux pacman package management tool. +It consists of a package browser, sudo helper, notifier, cache cleaner and repository editor. From 1bef285a760e32e6ffd9ca44cf1f48a6d5ee9ed0 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 19 May 2025 14:08:57 +0200 Subject: [PATCH 62/99] add material icons --- technology/dev/Material Icons.md | 74 ++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 technology/dev/Material Icons.md diff --git a/technology/dev/Material Icons.md b/technology/dev/Material Icons.md new file mode 100644 index 0000000..c44bee3 --- /dev/null +++ b/technology/dev/Material Icons.md @@ -0,0 +1,74 @@ +--- +obj: concept +website: https://fonts.google.com/icons +repo: https://github.com/google/material-design-icons +--- + +# Material Icons +[Material Icons](https://fonts.google.com/icons) are a comprehensive set of visual symbols designed by Google. These icons follow the [Material Design](https://m3.material.io/) guidelines and are widely used across Android, web, and other platforms to provide a consistent, clean, and intuitive UI experience. + +## Features +* Over 2,000 icons +* Available in multiple styles (Filled, Outlined, Rounded, Sharp, Two-tone) +* Free and open-source under the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0) +* Easily customizable (size, color, weight) +* Supported via web fonts, SVGs, and icon components + +## Icon Styles +| Style | Description | +| -------- | ----------------------------------------- | +| Filled | Default solid icons | +| Outlined | Icons with a thin, outlined design | +| Rounded | Icons with rounded corners | +| Sharp | Icons with sharp, angular edges | +| Two-tone | Icons with dual-tone for visual hierarchy | + +## Installation + +### Web Font +Add the following `` tag to your HTML ``: + +```html + +``` + +Then use an icon like this: +```html +home +``` + +To use other styles (e.g., Outlined, Rounded), change the font family: +```html + +``` + +Use it like: +```html +home +``` + +## SVG +You can download individual icons as SVGs from [Material Icons](https://fonts.google.com/icons) or use them programmatically. + +Example: +```html +home icon +``` + +## Customization + +### Size +Use CSS to change the size: +```html +home +``` + +Or use utility classes in frameworks like Tailwind: +```html +home +``` + +### Color +```html +home +``` From a0179e824ee2abe7c4b2eb8ad6cbfbd40fd0c606 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 19 May 2025 15:40:41 +0200 Subject: [PATCH 63/99] update rnr --- technology/applications/cli/rnr.md | 105 +++++++++++++++++++++++++---- 1 file changed, 93 insertions(+), 12 deletions(-) diff --git a/technology/applications/cli/rnr.md b/technology/applications/cli/rnr.md index b457b68..6b91c67 100644 --- a/technology/applications/cli/rnr.md +++ b/technology/applications/cli/rnr.md @@ -1,20 +1,101 @@ --- obj: application repo: https://github.com/ismaelgv/rnr +rev: 2025-05-19 --- # rnr -[Repo](https://github.com/ismaelgv/rnr) -**RnR** is a command-line tool to **securely rename** multiple files and directories that supports regular expressions. +RnR is a command-line tool to rename multiple files and directories that supports regular expressions. ## Usage -Flags -```shell --n, --dry-run Only show what would be done (default mode) --f, --force Make actual changes to files --x, --hidden Include hidden files and directories --D, --include-dirs Rename matching directories --r, --recursive Recursive mode --s, --silent Do not print any information ---no-dump Do not dump operations into a file -``` \ No newline at end of file +Usage: `rnr ` + +Commands: +- `regex`: Rename files and directories using a regular expression +- `from-file`: Read operations from a dump file +- `to-ascii`: Replace file name UTF-8 chars with ASCII chars representation + +### regex +``` +Rename files and directories using a regular expression + +Usage: rnr regex [OPTIONS] ... + +Arguments: + Expression to match (can be a regex) + Expression replacement (use single quotes for capture groups) + ... Target paths + +Options: + -n, --dry-run + Only show what would be done (default mode) + -f, --force + Make actual changes to files + -b, --backup + Generate file backups before renaming + -s, --silent + Do not print any information + --color + Set color output mode [default: auto] [possible values: always, never, auto] + --dump + Force dumping operations into a file even in dry-run mode + --dump-prefix + Set the dump file prefix [default: rnr-] + --no-dump + Do not dump operations into a file + -l, --replace-limit + Limit of replacements, all matches if set to 0 + -t, --replace-transform + Apply a transformation to replacements including captured groups [possible values: upper, lower, ascii] + -D, --include-dirs + Rename matching directories + -r, --recursive + Recursive mode + -d, --max-depth + Set max depth in recursive mode + -x, --hidden + Include hidden files and directories +``` + +### from-file +``` +Read operations from a dump file + +Usage: rnr from-file [OPTIONS] + +Arguments: + + +Options: + -n, --dry-run Only show what would be done (default mode) + -f, --force Make actual changes to files + -b, --backup Generate file backups before renaming + -s, --silent Do not print any information + --color Set color output mode [default: auto] [possible values: always, never, auto] + --dump Force dumping operations into a file even in dry-run mode + --dump-prefix Set the dump file prefix [default: rnr-] + --no-dump Do not dump operations into a file + -u, --undo Undo the operations from the dump file +``` + +### to-ascii +``` +Usage: rnr to-ascii [OPTIONS] ... + +Arguments: + ... Target paths + +Options: + -n, --dry-run Only show what would be done (default mode) + -f, --force Make actual changes to files + -b, --backup Generate file backups before renaming + -s, --silent Do not print any information + --color Set color output mode [default: auto] [possible values: always, never, auto] + --dump Force dumping operations into a file even in dry-run mode + --dump-prefix Set the dump file prefix [default: rnr-] + --no-dump Do not dump operations into a file + -D, --include-dirs Rename matching directories + -r, --recursive Recursive mode + -d, --max-depth Set max depth in recursive mode + -x, --hidden Include hidden files and directories +``` From a97795fd6d68de9c8cc7592c9cc881af0275425b Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 19 May 2025 15:47:54 +0200 Subject: [PATCH 64/99] add opengist --- technology/applications/web/opengist.md | 208 ++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 technology/applications/web/opengist.md diff --git a/technology/applications/web/opengist.md b/technology/applications/web/opengist.md new file mode 100644 index 0000000..046b906 --- /dev/null +++ b/technology/applications/web/opengist.md @@ -0,0 +1,208 @@ +--- +obj: application +website: https://opengist.io +repo: https://github.com/thomiceli/opengist +rev: 2025-05-19 +--- + +# OpenGist +Opengist is a self-hosted pastebin powered by Git. All snippets are stored in a Git repository and can be read and/or modified using standard Git commands, or with the web interface. It is similiar to GitHub Gist, but open-source and could be self-hosted. + +## Features +- Create public, unlisted or private snippets +- Init / Clone / Pull / Push snippets via Git over HTTP or SSH +- Syntax highlighting ; markdown & CSV support +- Search code in snippets ; browse users snippets, likes and forks +- Add topics to snippets +- Embed snippets in other websites +- Revisions history +- Like / Fork snippets +- Editor with indentation mode & size ; drag and drop files +- Download raw files or as a ZIP archive +- Retrieve snippet data/metadata via a JSON API +- OAuth2 login with GitHub, GitLab, Gitea, and OpenID Connect +- Avatars via Gravatar or OAuth2 providers +- Light/Dark mode +- Responsive UI +- Enable or disable signups +- Restrict or unrestrict snippets visibility to anonymous users + +## Compose +```yml +services: + opengist: + image: ghcr.io/thomiceli/opengist:1 + container_name: opengist + restart: unless-stopped + ports: + - "6157:6157" # HTTP port + - "2222:2222" # SSH port, can be removed if you don't use SSH + volumes: + - "$HOME/.opengist:/opengist" + environment: + # OG_LOG_LEVEL: info + # other configuration options +``` + +## Configuration + +| YAML Config Key | Environment Variable | Default value | Description | +| --------------------- | ----------------------------------- | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| log-level | OG_LOG_LEVEL | `warn` | Set the log level to one of the following: `debug`, `info`, `warn`, `error`, `fatal`. | +| log-output | OG_LOG_OUTPUT | `stdout,file` | Set the log output to one or more of the following: `stdout`, `file`. | +| external-url | OG_EXTERNAL_URL | none | Public URL to access to Opengist. | +| opengist-home | OG_OPENGIST_HOME | home directory | Path to the directory where Opengist stores its data. | +| secret-key | OG_SECRET_KEY | randomized 32 bytes | Secret key used for session store & encrypt MFA data on database. | +| db-uri | OG_DB_URI | `opengist.db` | URI of the database. | +| index | OG_INDEX | `bleve` | Define the code indexer (either `bleve`, `meilisearch`, or empty for no index). | +| index.meili.host | OG_MEILI_HOST | none | Set the host for the Meiliseach server. | +| index.meili.api-key | OG_MEILI_API_KEY | none | Set the API key for the Meiliseach server. | +| git.default-branch | OG_GIT_DEFAULT_BRANCH | none | Default branch name used by Opengist when initializing Git repositories. If not set, uses the Git default branch name. More info [here](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup#_new_default_branch) | +| sqlite.journal-mode | OG_SQLITE_JOURNAL_MODE | `WAL` | Set the journal mode for SQLite. More info [here](https://www.sqlite.org/pragma.html#pragma_journal_mode) | +| http.host | OG_HTTP_HOST | `0.0.0.0` | The host on which the HTTP server should bind. | +| http.port | OG_HTTP_PORT | `6157` | The port on which the HTTP server should listen. | +| http.git-enabled | OG_HTTP_GIT_ENABLED | `true` | Enable or disable git operations (clone, pull, push) via HTTP. (`true` or `false`) | +| metrics.enabled | OG_METRICS_ENABLED | `false` | Enable or disable Prometheus metrics endpoint at `/metrics` (`true` or `false`) | +| ssh.git-enabled | OG_SSH_GIT_ENABLED | `true` | Enable or disable git operations (clone, pull, push) via SSH. (`true` or `false`) | +| ssh.host | OG_SSH_HOST | `0.0.0.0` | The host on which the SSH server should bind. | +| ssh.port | OG_SSH_PORT | `2222` | The port on which the SSH server should listen. | +| ssh.external-domain | OG_SSH_EXTERNAL_DOMAIN | none | Public domain for the Git SSH connection, if it has to be different from the HTTP one. If not set, uses the URL from the request. | +| ssh.keygen-executable | OG_SSH_KEYGEN_EXECUTABLE | `ssh-keygen` | Path to the SSH key generation executable. | +| github.client-key | OG_GITHUB_CLIENT_KEY | none | The client key for the GitHub OAuth application. | +| github.secret | OG_GITHUB_SECRET | none | The secret for the GitHub OAuth application. | +| gitlab.client-key | OG_GITLAB_CLIENT_KEY | none | The client key for the GitLab OAuth application. | +| gitlab.secret | OG_GITLAB_SECRET | none | The secret for the GitLab OAuth application. | +| gitlab.url | OG_GITLAB_URL | `https://gitlab.com/` | The URL of the GitLab instance. | +| gitlab.name | OG_GITLAB_NAME | `GitLab` | The name of the GitLab instance. It is displayed in the OAuth login button. | +| gitea.client-key | OG_GITEA_CLIENT_KEY | none | The client key for the Gitea OAuth application. | +| gitea.secret | OG_GITEA_SECRET | none | The secret for the Gitea OAuth application. | +| gitea.url | OG_GITEA_URL | `https://gitea.com/` | The URL of the Gitea instance. | +| gitea.name | OG_GITEA_NAME | `Gitea` | The name of the Gitea instance. It is displayed in the OAuth login button. | +| oidc.provider-name | OG_OIDC_PROVIDER_NAME | none | The name of the OIDC provider | +| oidc.client-key | OG_OIDC_CLIENT_KEY | none | The client key for the OpenID application. | +| oidc.secret | OG_OIDC_SECRET | none | The secret for the OpenID application. | +| oidc.discovery-url | OG_OIDC_DISCOVERY_URL | none | Discovery endpoint of the OpenID provider. | +| ldap.url | OG_LDAP_URL | none | URL of the LDAP instance; if not set, LDAP authentication is disabled | +| ldap.bind-dn | OG_LDAP_BIND_DN | none | Bind DN to authenticate against the LDAP. e.g: cn=read-only-admin,dc=example,dc=com | +| ldap.bind-credentials | OG_LDAP_BIND_CREDENTIALS | none | The password for the Bind DN. | +| ldap.search-base | OG_LDAP_SEARCH_BASE | none | The Base DN to start search from. e.g: ou=People,dc=example,dc=com | +| ldap.search-filter | OG_LDAP_SEARCH_FILTER | none | The filter to search against (the format string %s will be replaced with the username). e.g: (uid=%s) | +| custom.name | OG_CUSTOM_NAME | none | The name of your instance, to be displayed in the tab title | +| custom.logo | OG_CUSTOM_LOGO | none | Path to an image, relative to $opengist-home/custom. | +| custom.favicon | OG_CUSTOM_FAVICON | none | Path to an image, relative to $opengist-home/custom. | +| custom.static-links | OG_CUSTOM_STATIC_LINK_#_(PATH,NAME) | none | Path and name to custom links, more info [here](custom-links.md). | + +## Usage +### Init Gists via Git +Opengist allows you to create new snippets via Git over HTTP. + +Simply init a new Git repository where your file(s) is/are located: + +```shell +git init +git add . +git commit -m "My cool snippet" +``` + +Then add this Opengist special remote URL and push your changes: + +```shell +git remote add origin http://localhost:6157/init + +git push -u origin master +``` + +Log in with your Opengist account credentials, and your snippet will be created at the specified URL: + +```shell +Username for 'http://localhost:6157': thomas +Password for 'http://thomas@localhost:6157': +Enumerating objects: 3, done. +Counting objects: 100% (3/3), done. +Delta compression using up to 8 threads +Compressing objects: 100% (2/2), done. +Writing objects: 100% (3/3), 416 bytes | 416.00 KiB/s, done. +Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 +remote: +remote: Your new repository has been created here: http://localhost:6157/thomas/6051e930f140429f9a2f3bb1fa101066 +remote: +remote: If you want to keep working with your gist, you could set the remote URL via: +remote: git remote set-url origin http://localhost:6157/thomas/6051e930f140429f9a2f3bb1fa101066 +remote: +To http://localhost:6157/init + * [new branch] master -> master +``` + +### Embed a Gist to your webpage +To embed a Gist to your webpage, you can add a script tag with the URL of your gist followed by `.js` to your HTML page: + +```html + + + + +``` + +### Retrieve Gist as JSON +To retrieve a Gist as JSON, you can add `.json` to the end of the URL of your gist: + +```shell +curl http://opengist.url/thomas/my-gist.json | jq '.' +``` + +It returns a JSON object with the following structure similar to this one: +```json +{ + "created_at": "2023-04-12T13:15:20+02:00", + "description": "", + "embed": { + "css": "http://localhost:6157/assets/embed-94abc261.css", + "html": "
\n
\n \n
\n \n \n \n \n

Welcome to Opengist

\n
\n \n\n
\n \n
\n
\n", + "js": "http://localhost:6157/thomas/my-gist.js", + "js_dark": "http://localhost:6157/thomas/my-gist.js?dark" + }, + "files": [ + { + "filename": "hello.md", + "size": 21, + "human_size": "21 B", + "content": "# Welcome to Opengist", + "truncated": false, + "type": "Markdown" + } + ], + "id": "my-gist", + "owner": "thomas", + "title": "hello.md", + "uuid": "8622b297bce54b408e36d546cef8019d", + "visibility": "public" +} +``` + +### Push Options +Opengist has support for a few [Git push options](https://git-scm.com/docs/git-push#Documentation/git-push.txt--oltoptiongt). + +These options are passed to `git push` command and can be used to change the metadata of a gist. + +#### Set URL +```shell +git push -o url=mygist # Will set the URL to https://opengist.example.com/user/mygist +``` + +#### Change title +```shell +git push -o title=Gist123 +git push -o title="My Gist 123" +``` + +#### Change description +```shell +git push -o description="This is my gist description" +``` + +#### Change visibility +```shell +git push -o visibility=public +git push -o visibility=unlisted +git push -o visibility=private +``` From 576421a6be2a23a111b2399a5e08d6032f45c3c1 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Mon, 19 May 2025 15:57:29 +0200 Subject: [PATCH 65/99] add ruff --- technology/applications/development/ruff.md | 41 +++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 technology/applications/development/ruff.md diff --git a/technology/applications/development/ruff.md b/technology/applications/development/ruff.md new file mode 100644 index 0000000..05596c9 --- /dev/null +++ b/technology/applications/development/ruff.md @@ -0,0 +1,41 @@ +--- +obj: application +repo: https://github.com/astral-sh/ruff +website: https://docs.astral.sh/ruff +rev: 2025-05-19 +--- + +# ruff +An extremely fast Python linter and code formatter, written in Rust. + +## The Ruff Linter +The Ruff Linter is an extremely fast Python linter designed as a drop-in replacement for [Flake8](https://pypi.org/project/flake8/) (plus dozens of plugins), [isort](https://pypi.org/project/isort/), [pydocstyle](https://pypi.org/project/pydocstyle/), [pyupgrade](https://pypi.org/project/pyupgrade/), [autoflake](https://pypi.org/project/autoflake/), and more. + +### `ruff check` +`ruff check` is the primary entrypoint to the Ruff linter. It accepts a list of files or directories, and lints all discovered Python files, optionally fixing any fixable errors. When linting a directory, Ruff searches for Python files recursively in that directory and all its subdirectories: + +```console +$ ruff check # Lint files in the current directory. +$ ruff check --fix # Lint files in the current directory and fix any fixable errors. +$ ruff check --watch # Lint files in the current directory and re-lint on change. +$ ruff check path/to/code/ # Lint files in `path/to/code`. +``` + +## The Ruff Formatter +The Ruff formatter is an extremely fast Python code formatter designed as a drop-in replacement for [Black](https://pypi.org/project/black/), available as part of the `ruff` CLI via `ruff format`. + +### `ruff format` +`ruff format` is the primary entrypoint to the formatter. It accepts a list of files or directories, and formats all discovered Python files: + +```shell +ruff format # Format all files in the current directory. +ruff format path/to/code/ # Format all files in `path/to/code` (and any subdirectories). +ruff format path/to/file.py # Format a single file. +``` + +Similar to Black, running `ruff format /path/to/file.py` will format the given file or directory in-place, while `ruff format --check /path/to/file.py` will avoid writing any formatted files back, and instead exit with a non-zero status code upon detecting any unformatted files. + +For the full list of supported options, run `ruff format --help`. + +## Configuration +ruff can be configured via `ruff.toml` config file. See [here](https://docs.astral.sh/ruff/settings/) for a reference of all config parameters. From 9f6a31e8ef28d05e64037de1a780c90980b63c3a Mon Sep 17 00:00:00 2001 From: JMARyA Date: Wed, 21 May 2025 13:10:23 +0200 Subject: [PATCH 66/99] add artem --- technology/applications/media/artem.md | 30 ++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 technology/applications/media/artem.md diff --git a/technology/applications/media/artem.md b/technology/applications/media/artem.md new file mode 100644 index 0000000..f258c38 --- /dev/null +++ b/technology/applications/media/artem.md @@ -0,0 +1,30 @@ +--- +obj: application +repo: https://github.com/FineFindus/artem +--- + +# artem +Artem is a small cli program, written in rust, to easily convert images to ascii art, named after the latin word for art. By default it tries to use truecolor, if the terminal does not support truecolor, it falls back to 16 Color ANSI. When the ascii image is written to a file, the image will not use colors. It supports .jpeg, .png, .gif, .webp and many more. + +## Usage +Usage: `artem [options] [image]` + +| `Option` | `Description` | +| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-c, --characters ` | Change the characters used to display the image. The first character should have the highest 'darkness' and the last should have the least (recommended to be a space ' '). A lower detail map is recommended for smaller images. | +| `-s, --size ` | Change the size of the output image. The minimum size is 20. Lower values will be ignored and changed to 20. Conflicts with `--width` and `--height`. \[default: 80] | +| `--height` | Use the terminal maximum height to display the image. Conflicts with `--size` and `--width`. | +| `-w, --width` | Use the terminal maximum width to display the image. Conflicts with `--size` and `--height`. | +| `--ratio ` | Change the ratio between height and width. The value must be between 0.1 and 1.0. It is not recommended to change this setting. \[default: 0.42] | +| `--flipX` | Flip the image along the X-Axis/horizontally. | +| `--flipY` | Flip the image along the Y-Axis/vertically. | +| `--centerX` | Center the image along the X-Axis/horizontally in the terminal. | +| `--centerY` | Center the image along the Y-Axis/vertically in the terminal. | +| `-o, --output ` | Output file for non-colored ASCII. For color, use a file with .ansi, .svg, or .html extension. .ansi files will consider environment variables when creating colored output. | +| `--invert` | Inverts the characters used for the image, so light characters will be dark. Useful if the image has a dark background. | +| `--background` | Sets the background of the ASCII as the color. Ignored if the terminal does not support truecolor. Mutually exclusive with `--no-color`. | +| `--border` | Adds a decorative border surrounding the ASCII image, making the image slightly smaller as it respects the given size. | +| `--no-color` | Do not use color when printing the image to the terminal. | +| `--outline` | Only create an outline of the image. Uses filters and may take more resources/time, especially on larger images. Best used on images with clear foreground/background distinction. | +| `--hysteresis` | When creating the outline, use the hysteresis method to remove imperfections, but might not look as good in ASCII form. Requires `--outline` to be present. | +| `--verbose ` | Choose the verbosity of the logging level. \[default: warn] Possible values: off, error, warn, info, debug, trace. | From 502dfdebdc6843b3d27692d96901bd8bd1add99e Mon Sep 17 00:00:00 2001 From: JMARyA Date: Wed, 21 May 2025 13:42:18 +0200 Subject: [PATCH 67/99] add distrobox --- .../applications/utilities/distrobox.md | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 technology/applications/utilities/distrobox.md diff --git a/technology/applications/utilities/distrobox.md b/technology/applications/utilities/distrobox.md new file mode 100644 index 0000000..346dd40 --- /dev/null +++ b/technology/applications/utilities/distrobox.md @@ -0,0 +1,112 @@ +--- +obj: application +website: https://distrobox.it +arch-wiki: https://wiki.archlinux.org/title/Distrobox +repo: https://github.com/89luca89/distrobox +--- + +# DistroBox +Use any Linux distribution inside your terminal. Enable both backward and forward compatibility with software and freedom to use whatever distribution you’re more comfortable with. Distrobox uses podman, docker or lilipod to create containers using the Linux distribution of your choice. The created container will be tightly integrated with the host, allowing sharing of the HOME directory of the user, external storage, external USB devices and graphical apps (X11/Wayland), and audio. + +## Usage +To create a new container run the following: +``` +$ distrobox create -n name +``` + +To list installed containers run the following: +``` +$ distrobox list +``` + +To interact with an installed container run the following: +``` +$ distrobox enter name +``` + +or you can send a command directly to a container with: +``` +$ distrobox enter name -- command-to-execute +``` + +To stop a running container run the following: +``` +$ distrobox stop name +``` + +To delete a container run the following: +``` +$ distrobox rm name +``` + +To install a specific distro into a container run the following (in this example it is Ubuntu): +``` +$ distrobox create --image ubuntu:22.04 +``` + +Installations can be fully customised as follows (in this example it is a container called test running Gentoo with root access): +``` +$ distrobox create -i docker.io/gentoo/stage3:latest -n test --root +``` + +If you need your container to have root access to the host then it is recommended that you use the `--root` flag over `sudo distrobox`. + +### Unsharing mode +Distrobox allows users to partially isolate certain system aspects through its unshare feature. By default, the following components are shared between host and container: + +`devsysfs`, `ipc`, `netns`, `process`, `$HOME` and Application access. + +You can choose to unshare some of these components by using the commands listed below when creating a new container: + +#### Shares + +| Share | Command | Usage | +| ---------- | -------------------- | --------------------------------------------------- | +| `devsysfs` | `--unshare-devsysfs` | Do not share host devices and sysfs dirs from host. | +| `ipc` | `--unshare-ipc` | Do not share the ipc namespace with host. | +| `netns` | `--unshare-netns` | Do not share the network namespace with host. | +| `process` | `--unshare-process` | Do not share the process namespace with host. | +| All | `--unshare-all` | Activate all unshare flags. | + +Note that unsharing `$HOME` and Application access is not possible, as these are mandatory for Distrobox's core functionality. + +> Warning: While the unsharing feature provides some isolation between container and host, it does not constitute a full security sandbox. You should not rely on it for complete security isolation. + +## Configuration +It is possible to configure Distrobox in two ways, either with a configuration file or by using environment variables. + +### Configuration file +Distrobox checks the following locations for config files, from least important to most important: + +- `/usr/share/distrobox/distrobox.conf` +- `/usr/etc/distrobox/distrobox.conf` +- `/etc/distrobox/distrobox.conf` +- `~/.config/distrobox/distrobox.conf` +- `~/.distroboxrc` + +An example config file is as follows: +``` +container_always_pull="1" +container_generate_entry=0 +container_manager="docker" +container_image_default="registry.opensuse.org/opensuse/toolbox:latest" +container_name_default="test-name-1" +container_user_custom_home="$HOME/.local/share/container-home-test" +container_init_hook="~/.local/distrobox/a_custom_default_init_hook.sh" +container_pre_init_hook="~/a_custom_default_pre_init_hook.sh" +non_interactive="1" +skip_workdir="0" +``` + +### Environment variables +The following variables are available and should be set using per user variables: +``` +DBX_CONTAINER_ALWAYS_PULL +DBX_CONTAINER_CUSTOM_HOME +DBX_CONTAINER_IMAGE +DBX_CONTAINER_MANAGER +DBX_CONTAINER_NAME +DBX_CONTAINER_ENTRY +DBX_NON_INTERACTIVE +DBX_SKIP_WORKDIR +``` From 6869f6eca58365d4a3b57412b6078217ca447985 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Wed, 21 May 2025 16:52:05 +0200 Subject: [PATCH 68/99] add mdbook --- technology/applications/office/mdbook.md | 530 +++++++++++++++++++++++ 1 file changed, 530 insertions(+) create mode 100644 technology/applications/office/mdbook.md diff --git a/technology/applications/office/mdbook.md b/technology/applications/office/mdbook.md new file mode 100644 index 0000000..421e816 --- /dev/null +++ b/technology/applications/office/mdbook.md @@ -0,0 +1,530 @@ +--- +obj: application +website: https://rust-lang.github.io/mdBook/ +repo: https://github.com/rust-lang/mdBook +rev: 2025-05-21 +--- + +# mdbook +`mdBook` is a command-line tool for creating books from Markdown files. It is designed to generate a static website based on Markdown content, perfect for creating online documentation, tutorials, and books. It is similar to GitBook but is written in Rust and is fully open-source. + +## Usage +The basic command for `mdBook` is as follows: + +```bash +mdbook [options] +``` + +### Available Commands + +* `init`: Creates a new book in the current directory. +* `build`: Builds the book (default). +* `serve`: Serves the book locally with hot reloading. +* `test`: Runs tests on the book. +* `clean`: Cleans the book’s build artifacts. +* `watch`: Watches for file changes and rebuilds the book. + +### Examples + +1. **Building the book**: + + ```bash + mdbook build + ``` + +2. **Serving the book locally**: + + ```bash + mdbook serve + ``` + +3. **Initializing a new book**: + + ```bash + mdbook init my-book + ``` + + This creates a new directory called `my-book` and sets up a template for your book. + +## Book Format +The structure of the book’s source directory typically looks like this: + +``` +my-book/ +├── src/ +│ ├── SUMMARY.md +│ ├── chapter_1.md +│ ├── chapter_2.md +│ └── ... +├── book.toml +└── README.md +``` + +### Key Files and Directories +* `src/`: Contains the Markdown files for your book. This is where the content resides. + * `SUMMARY.md`: This file defines the table of contents and chapter structure of your book. It lists all of the sections and their hierarchical order. + * Other `.md` files: The content for each chapter or section of the book. +* `book.toml`: The configuration file that defines the metadata and settings for the book (e.g., title, author, theme). +* `README.md`: This file is optional and provides a description of your book. + +### Configuration File (`book.toml`) +The `book.toml` file contains configuration settings for the book. Below is an example configuration: + +```toml +[book] +title = "Example book" +authors = ["John Doe"] +description = "The example book covers examples." + +[rust] +edition = "2018" + +[build] +build-dir = "my-example-book" +create-missing = false + +[preprocessor.index] + +[preprocessor.links] + +[output.html] +additional-css = ["custom.css"] + +[output.html.search] +limit-results = 15 +``` + +### `SUMMARY.md` file +The summary file is used by mdBook to know what chapters to include, in what order they should appear, what their hierarchy is and where the source files are. Without this file, there is no book. + +This markdown file must be named `SUMMARY.md`. Its formatting is very strict and must follow the structure outlined below to allow for easy parsing. Any element not specified below, be it formatting or textual, is likely to be ignored at best, or may cause an error when attempting to build the book. + +#### Structure +- `Title` - While optional, it’s common practice to begin with a title, generally `# Summary`. This is ignored by the parser however, and can be omitted. +```md +# Summary +``` + +- `Prefix Chapter` - Before the main numbered chapters, prefix chapters can be added that will not be numbered. This is useful for forewords, introductions, etc. There are, however, some constraints. Prefix chapters cannot be nested; they should all be on the root level. And you cannot add prefix chapters once you have added numbered chapters. +```md +[A Prefix Chapter](relative/path/to/markdown.md) + +- [First Chapter](relative/path/to/markdown2.md) +``` + +- `Part Title` - Level 1 headers can be used as a title for the following numbered chapters. This can be used to logically separate different sections of the book. The title is rendered as unclickable text. Titles are optional, and the numbered chapters can be broken into as many parts as desired. Part titles must be h1 headers (one `#`), other heading levels are ignored. +```md +# My Part Title + +- [First Chapter](relative/path/to/markdown.md) +``` + +- `Numbered Chapter` - Numbered chapters outline the main content of the book and can be nested, resulting in a nice hierarchy (chapters, sub-chapters, etc.). +```md +# Title of Part + +- [First Chapter](relative/path/to/markdown.md) +- [Second Chapter](relative/path/to/markdown2.md) + - [Sub Chapter](relative/path/to/markdown3.md) + +# Title of Another Part + +- [Another Chapter](relative/path/to/markdown4.md) +``` + +Numbered chapters can be denoted with either - or * (do not mix delimiters). + +- `Suffix Chapter` - Like prefix chapters, suffix chapters are unnumbered, but they come after numbered chapters. +```md +- [Last Chapter](relative/path/to/markdown.md) + +[Title of Suffix Chapter](relative/path/to/markdown2.md) +``` + +- `Draft chapters` - Draft chapters are chapters without a file and thus content. The purpose of a draft chapter is to signal future chapters still to be written. Or when still laying out the structure of the book to avoid creating the files while you are still changing the structure of the book a lot. Draft chapters will be rendered in the HTML renderer as disabled links in the table of contents, as you can see for the next chapter in the table of contents on the left. Draft chapters are written like normal chapters but without writing the path to the file. +```md +- [Draft Chapter]() +``` + +- `Separators` - Separators can be added before, in between, and after any other element. They result in an HTML rendered line in the built table of contents. A separator is a line containing exclusively dashes and at least three of them: ---. +```md +# My Part Title + +[A Prefix Chapter](relative/path/to/markdown.md) + +--- + +- [First Chapter](relative/path/to/markdown2.md) +``` + +#### Example +Below is a full example `SUMMARY.md`: + +```md +# Summary + +[Introduction](README.md) + +# User Guide + +- [Installation](guide/installation.md) +- [Reading Books](guide/reading.md) +- [Creating a Book](guide/creating.md) + +# Reference Guide + +- [Command Line Tool](cli/README.md) + - [init](cli/init.md) + - [build](cli/build.md) + - [watch](cli/watch.md) + - [serve](cli/serve.md) + - [test](cli/test.md) + - [clean](cli/clean.md) + - [completions](cli/completions.md) +- [Format](format/README.md) + - [SUMMARY.md](format/summary.md) + - [Draft chapter]() + - [Configuration](format/configuration/README.md) + - [General](format/configuration/general.md) + - [Preprocessors](format/configuration/preprocessors.md) + - [Renderers](format/configuration/renderers.md) + - [Environment Variables](format/configuration/environment-variables.md) + - [Theme](format/theme/README.md) + - [index.hbs](format/theme/index-hbs.md) + - [Syntax highlighting](format/theme/syntax-highlighting.md) + - [Editor](format/theme/editor.md) + - [MathJax Support](format/mathjax.md) + - [mdBook-specific features](format/mdbook.md) + - [Markdown](format/markdown.md) +- [Continuous Integration](continuous-integration.md) +- [For Developers](for_developers/README.md) + - [Preprocessors](for_developers/preprocessors.md) + - [Alternative Backends](for_developers/backends.md) + +----------- + +[Contributors](misc/contributors.md) +``` + +### Preprocessors +Preprocessors are extensions that can modify the raw Markdown source before it gets sent to the renderer. + +The following preprocessors are built-in and included by default: +- links: Expands the `{{ #playground }}`, `{{ #include }}`, and `{{ #rustdoc_include }}` handlebars helpers in a chapter to include the contents of a file. +- index: Convert all chapter files named `README.md` into `index.md`. That is to say, all `README.md` would be rendered to an index file `index.html` in the rendered book. + +The built-in preprocessors can be disabled with the `build.use-default-preprocessors` config option. + +The community has developed several preprocessors. See the [Third Party Plugins wiki page](https://github.com/rust-lang/mdBook/wiki/Third-party-plugins) for a list of available preprocessors. + +#### Custom Preprocessor Configuration +Preprocessors can be added by including a `preprocessor` table in `book.toml` with the name of the preprocessor. For example, if you have a preprocessor called `mdbook-example`, then you can include it with: +```toml +[preprocessor.example] +``` + +With this table, mdBook will execute the mdbook-example preprocessor. + +This table can include additional key-value pairs that are specific to the preprocessor. For example, if our example preprocessor needed some extra configuration options: +```toml +[preprocessor.example] +some-extra-feature = true +``` + +#### Locking a Preprocessor dependency to a renderer +You can explicitly specify that a preprocessor should run for a renderer by binding the two together. +```toml +[preprocessor.example] +renderers = ["html"] # example preprocessor only runs with the HTML renderer +``` + +#### Provide Your Own Command +By default when you add a `[preprocessor.foo]` table to your `book.toml` file, mdbook will try to invoke the `mdbook-foo` executable. If you want to use a different program name or pass in command-line arguments, this behaviour can be overridden by adding a command field. +```toml +[preprocessor.random] +command = "python random.py" +``` + +#### Require A Certain Order +The order in which preprocessors are run can be controlled with the before and after fields. For example, suppose you want your linenos preprocessor to process lines that may have been `{{#include}}`d; then you want it to run after the built-in links preprocessor, which you can require using either the before or after field: +```toml +[preprocessor.linenos] +after = [ "links" ] +``` + +or + +``` +[preprocessor.links] +before = [ "linenos" ] +``` + +It would also be possible, though redundant, to specify both of the above in the same config file. + +Preprocessors having the same priority specified through before and after are sorted by name. Any infinite loops will be detected and produce an error. + +## Features +### Hiding code lines +There is a feature in mdBook that lets you hide code lines by prepending them with a specific prefix. + +For the Rust language, you can prefix lines with `# ` (# followed by a space) to hide them like you would with Rustdoc. This prefix can be escaped with `##` to prevent the hiding of a line that should begin with the literal string `#` (see Rustdoc’s docs for more details) +``` +# fn main() { + let x = 5; + let y = 6; + + println!("{}", x + y); +# } +``` + +Will render as +``` + let x = 5; + let y = 6; + + println!("{}", x + y); +``` + +When you tap or hover the mouse over the code block, there will be an eyeball icon which will toggle the visibility of the hidden lines. + +By default, this only works for code examples that are annotated with rust. However, you can define custom prefixes for other languages by adding a new line-hiding prefix in your `book.toml` with the language name and prefix character(s): + +```toml +[output.html.code.hidelines] +python = "~" +``` + +The prefix will hide any lines that begin with the given prefix. With the python prefix shown above, this: + +``` +~hidden() +nothidden(): +~ hidden() + ~hidden() + nothidden() +``` + +will render as +```python +nothidden(): + nothidden() +``` + +This behavior can be overridden locally with a different prefix. This has the same effect as above: + +``` +\```python,hidelines=!!! +!!!hidden() +nothidden(): +!!! hidden() + !!!hidden() + nothidden() +\``` +``` + +### Rust Playground +Rust language code blocks will automatically get a play button which will execute the code and display the output just below the code block. This works by sending the code to the Rust Playground. + +If there is no main function, then the code is automatically wrapped inside one. + +If you wish to disable the play button for a code block, you can include the `noplayground` option on the code block like this: + +``` +\```rust,noplayground +let mut name = String::new(); +std::io::stdin().read_line(&mut name).expect("failed to read line"); +println!("Hello {}!", name); +\``` +``` + +Or, if you wish to disable the play button for all code blocks in your book, you can write the config to the `book.toml` like this. + +```toml +[output.html.playground] +runnable = false +``` + +### Rust code block attributes +Additional attributes can be included in Rust code blocks with comma, space, or tab-separated terms just after the language term. For example: + +``` +\```rust,ignore +# This example won't be tested. +panic!("oops!"); +\``` +``` + +These are particularly important when using mdbook test to test Rust examples. These use the same attributes as rustdoc attributes, with a few additions: + +- `editable` — Enables the editor. +- `noplayground` — Removes the play button, but will still be tested. +- `mdbook-runnable` — Forces the play button to be displayed. This is intended to be combined with the ignore attribute for examples that should not be tested, but you want to allow the reader to run. +- `ignore` — Will not be tested and no play button is shown, but it is still highlighted as Rust syntax. +- `should_panic` — When executed, it should produce a panic. +- `no_run` — The code is compiled when tested, but it is not run. The play button is also not shown. +- `compile_fail` — The code should fail to compile. +- `edition2015`, `edition2018`, `edition2021` — Forces the use of a specific Rust edition. See rust.edition to set this globally. + +### Including files +With the following syntax, you can include files into your book: +``` +{{#include file.rs}} +``` + +The path to the file has to be relative from the current source file. + +mdBook will interpret included files as Markdown. Since the include command is usually used for inserting code snippets and examples, you will often wrap the command with ``` to display the file contents without interpreting them. + +``` +\``` +{{#include file.rs}} +\``` +``` + +### Including portions of a file +Often you only need a specific part of the file, e.g. relevant lines for an example. We support four different modes of partial includes: + +``` +{{#include file.rs:2}} +{{#include file.rs::10}} +{{#include file.rs:2:}} +{{#include file.rs:2:10}} +``` + +The first command only includes the second line from file `file.rs`. The second command includes all lines up to line 10, i.e. the lines from 11 till the end of the file are omitted. The third command includes all lines from line 2, i.e. the first line is omitted. The last command includes the excerpt of `file.rs` consisting of lines 2 to 10. + +To avoid breaking your book when modifying included files, you can also include a specific section using anchors instead of line numbers. An anchor is a pair of matching lines. The line beginning an anchor must match the regex `ANCHOR:\s*[\w_-]+` and similarly the ending line must match the regex `ANCHOR_END:\s*[\w_-]+`. This allows you to put anchors in any kind of commented line. + +Consider the following file to include: + +``` +/* ANCHOR: all */ + +// ANCHOR: component +struct Paddle { + hello: f32, +} +// ANCHOR_END: component + +////////// ANCHOR: system +impl System for MySystem { ... } +////////// ANCHOR_END: system + +/* ANCHOR_END: all */ +``` + +Then in the book, all you have to do is: + +``` +Here is a component: +\```rust,no_run,noplayground +{{#include file.rs:component}} +\``` + +Here is a system: +\```rust,no_run,noplayground +{{#include file.rs:system}} +\``` + +This is the full file. +\```rust,no_run,noplayground +{{#include file.rs:all}} +\``` +``` + +Lines containing anchor patterns inside the included anchor are ignored. + +### Including a file but initially hiding all except specified lines +The `rustdoc_include` helper is for including code from external Rust files that contain complete examples, but only initially showing particular lines specified with line numbers or anchors in the same way as with include. + +The lines not in the line number range or between the anchors will still be included, but they will be prefaced with `#`. This way, a reader can expand the snippet to see the complete example, and Rustdoc will use the complete example when you run mdbook test. + +For example, consider a file named `file.rs` that contains this Rust program: + +```rust +fn main() { + let x = add_one(2); + assert_eq!(x, 3); +} + +fn add_one(num: i32) -> i32 { + num + 1 +} +``` + +We can include a snippet that initially shows only line 2 by using this syntax: + +``` +To call the `add_one` function, we pass it an `i32` and bind the returned value to `x`: + +\```rust +{{#rustdoc_include file.rs:2}} +\``` +``` + +This would have the same effect as if we had manually inserted the code and hidden all but line 2 using `#`: + +### Inserting runnable Rust files +With the following syntax, you can insert runnable Rust files into your book: +``` +{{#playground file.rs}} +``` + +The path to the Rust file has to be relative from the current source file. + +When play is clicked, the code snippet will be sent to the Rust Playground to be compiled and run. The result is sent back and displayed directly underneath the code. + +### Controlling page `` +A chapter can set a `<title>` that is different from its entry in the table of contents (sidebar) by including a `{{#title ...}}` near the top of the page. + +``` +{{#title My Title}} +``` + +### HTML classes provided by mdBook +#### class="left" and "right" +These classes are provided by default, for inline HTML to float images. + +```html +<img class="right" src="images/rust-logo-blk.svg" alt="The Rust logo"> +``` + +#### class="hidden" +HTML tags with class hidden will not be shown. + +```html +<div class="hidden">This will not be seen.</div> +``` + +#### class="warning" +To make a warning or similar note stand out, wrap it in a warning div. + +```html +<div class="warning"> +``` + +### Math Support +mdBook has optional support for math equations through MathJax. + +To enable MathJax, you need to add the `mathjax-support` key to your `book.toml` under the `output.html` section. + +```toml +[output.html] +mathjax-support = true +``` + +> **Note**: The usual delimiters MathJax uses are not yet supported. You can’t currently use `$$ ... $$` as delimiters and the `\[ ... \]` delimiters need an extra backslash to work. + +#### Inline equations +Inline equations are delimited by `\\(` and `\\)`. So for example, to render the following inline equation you would write the following: + +``` +\\( \int x dx = \frac{x^2}{2} + C \\) +``` + +#### Block equations +Block equations are delimited by `\\[` and `\\]`. To render the following equation + +``` +\\[ \mu = \frac{1}{N} \sum_{i=0} x_i \\] +``` From 56399a5fc093a169c1e63e7a522c190bb4b3ed3e Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Tue, 27 May 2025 08:47:41 +0200 Subject: [PATCH 69/99] add starship --- technology/applications/cli/starship.md | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 technology/applications/cli/starship.md diff --git a/technology/applications/cli/starship.md b/technology/applications/cli/starship.md new file mode 100644 index 0000000..281f43d --- /dev/null +++ b/technology/applications/cli/starship.md @@ -0,0 +1,26 @@ +--- +obj: application +website: https://starship.rs +repo: https://github.com/starship/starship +rev: 2025-05-27 +--- + +# 🚀 Starship +The minimal, blazing-fast, and infinitely customizable prompt for any shell! + +## Setup +Install starship and add the following to your shells configuration: + +```sh +# For bash +eval "$(starship init bash)" +# For zsh +eval "$(starship init zsh)" +# For fish +starship init fish | source +``` + +## Configuration +Your shell prompt is build using modules showing relevant information. +You can customize these at `~/.config/starship.toml`. All configuration for starship is done in this TOML file. +See [this page](https://starship.rs/config/) for an overview of every configurable module. From 5005d3b7d1225c83311754a0d474f421ed122d2e Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Tue, 27 May 2025 13:46:57 +0200 Subject: [PATCH 70/99] add sftpgo --- technology/applications/web/sftpgo.md | 90 +++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 technology/applications/web/sftpgo.md diff --git a/technology/applications/web/sftpgo.md b/technology/applications/web/sftpgo.md new file mode 100644 index 0000000..cf629f5 --- /dev/null +++ b/technology/applications/web/sftpgo.md @@ -0,0 +1,90 @@ +--- +obj: application +website: https://sftpgo.com +repo: https://github.com/drakkan/sftpgo +source: https://docs.sftpgo.com/latest +--- + +# SFTPGo +SFTPGo is an event-driven file transfer solution. It support multiple protocols (SFTP, SCP, FTP/S, WebDAV, HTTP/S) and multiple storage backends. +With SFTPGo you can leverage local and cloud storage backends for exchanging and storing files internally or with business partners using the same tools and processes you are already familiar with. +The WebAdmin UI allows to easily create and manage your users, folders, groups and other resources. + +## Features +- Support for serving local filesystem, encrypted local filesystem, S3 Compatible Object Storage, Google Cloud Storage, Azure Blob Storage or other SFTP accounts over SFTP/SCP/FTP/WebDAV. +- Virtual folders are supported: a virtual folder can use any of the supported storage backends. So you can have, for example, a user with the S3 backend mapping a GCS bucket (or part of it) on a specified path and an encrypted local filesystem on another one. Virtual folders can be private or shared among multiple users, for shared virtual folders you can define different quota limits for each user. +- Configurable custom commands and/or HTTP hooks on upload, pre-upload, download, pre-download, delete, pre-delete, rename, mkdir, rmdir on SSH commands and on user add, update and delete. +- Virtual accounts stored within a "data provider". +- SQLite, MySQL, PostgreSQL, CockroachDB, Bolt (key/value store in pure Go) and in-memory data providers are supported. +- Chroot isolation for local accounts. Cloud-based accounts can be restricted to a certain base path. +- Per-user and per-directory virtual permissions, for each path you can allow or deny: directory listing, upload, overwrite, download, delete, rename, create directories, create symlinks, change owner/group/file mode and modification time. +- REST API for users and folders management, data retention, backup, restore and real time reports of the active connections with possibility of forcibly closing a connection. +- The Event Manager allows to define custom workflows based on server events or schedules. +- Web based administration interface to easily manage users, folders and connections. +- Web client interface so that end users can change their credentials, manage and share their files in the browser. +- Public key and password authentication. Multiple public keys per-user are supported. +- SSH user certificate authentication. +- Keyboard interactive authentication. You can easily setup a customizable multi-factor authentication. +- Partial authentication. You can configure multi-step authentication requiring, for example, the user password after successful public key authentication. +- Per-user authentication methods. +- Two-factor authentication based on time-based one time passwords (RFC 6238) which works with Google Authenticator, Microsoft Authenticator, Authy and other compatible apps. +- LDAP/Active Directory authentication using a plugin. +- Simplified user administrations using groups. +- Roles allow to create limited administrators who can only create and manage users with their role. +- Custom authentication via external programs/HTTP API. +- Web Client and Web Admin user interfaces support OpenID Connect authentication and so they can be integrated with identity providers such as Keycloak. You can find more details here. +- Data At Rest Encryption. +- Dynamic user modification before login via external programs/HTTP API. +- Quota support: accounts can have individual disk quota expressed as max total size and/or max number of files. +- Bandwidth throttling, with separate settings for upload and download and overrides based on the client's IP address. +- Data transfer bandwidth limits, with total limit or separate settings for uploads and downloads and overrides based on the client's IP address. Limits can be reset using the REST API. +- Per-protocol rate limiting is supported and can be optionally connected to the built-in defender to automatically block hosts that repeatedly exceed the configured limit. +- Per-user maximum concurrent sessions. +- Per-user and global IP filters: login can be restricted to specific ranges of IP addresses or to a specific IP address. +- Per-user and per-directory shell like patterns filters: files can be allowed, denied and optionally hidden based on shell like patterns. +- Automatically terminating idle connections. +- Automatic blocklist management using the built-in defender. +- Geo-IP filtering using a plugin. +- Atomic uploads are configurable. +- Per-user files/folders ownership mapping: you can map all the users to the system account that runs SFTPGo (all platforms are supported) or you can run SFTPGo as root user and map each user or group of users to a different system account (*NIX only). +- Support for Git repositories over SSH. +- SCP and rsync are supported. +- FTP/S is supported. You can configure the FTP service to require TLS for both control and data connections. +WebDAV is supported. +- ACME protocol is supported. SFTPGo can obtain and automatically renew TLS certificates for HTTPS, WebDAV and FTPS from Let's Encrypt or other ACME compliant certificate authorities, using the HTTP-01 or TLS-ALPN-01 challenge types. +- Two-Way TLS authentication, aka TLS with client certificate authentication, is supported for REST API/Web Admin, FTPS and WebDAV over HTTPS. +- Per-user protocols restrictions. You can configure the allowed protocols (SSH/HTTP/FTP/WebDAV) for each user. +- Prometheus metrics are supported. +- Support for HAProxy PROXY protocol: you can proxy and/or load balance the SFTP/SCP/FTP service without losing the information about the client's address. +- Easy migration from Linux system user accounts. +- Portable mode: a convenient way to share a single directory on demand. +- SFTP subsystem mode: you can use SFTPGo as OpenSSH's SFTP subsystem. +- Performance analysis using built-in profiler. +- Configuration format is at your choice: JSON, TOML, YAML, envfile are supported. +- Log files are accurate and they are saved in the easily parsable JSON format (more information). +- SFTPGo supports a plugin system and therefore can be extended using external plugins. +- Infrastructure as Code (IaC) support using the Terraform provider. +- Partial (experimental) support for internationalization for WebAdmin and WebClient user interfaces. + +## Compose +```yml +services: + sftpgo: + user: 1001:1001 # User + ports: + - 5927:5927 # Telemetry + - 5929:5929 # WebDAV + - 5928:8080 # HTTP UI + - 2222:2022 # SFTP + volumes: + - "./data:/srv/sftpgo" + - "./config:/var/lib/sftpgo" + environment: + # Telemetry + - "SFTPGO_TELEMETRY__BIND_PORT=5927" + - "SFTPGO_TELEMETRY__BIND_ADDRESS=0.0.0.0" + # WebDAV + - "SFTPGO_WEBDAVD__BINDINGS__0__PORT=5929" + - "SFTPGO_WEBDAVD__BINDINGS__0__ADDRESS=0.0.0.0" + image: drakkan/sftpgo:distroless-slim +``` From 494dd082bc432d3643de336d645886fb78044cca Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Wed, 28 May 2025 09:16:07 +0200 Subject: [PATCH 71/99] add wallust --- technology/applications/media/wallust.md | 392 +++++++++++++++++++++++ 1 file changed, 392 insertions(+) create mode 100644 technology/applications/media/wallust.md diff --git a/technology/applications/media/wallust.md b/technology/applications/media/wallust.md new file mode 100644 index 0000000..de84216 --- /dev/null +++ b/technology/applications/media/wallust.md @@ -0,0 +1,392 @@ +--- +obj: application +website: https://explosion-mental.codeberg.page/wallust +repo: https://codeberg.org/explosion-mental/wallust +rev: 2025-05-28 +--- + +# wallust +wallust is a command line tool for creating 16 color palettes, since it was the original intent of pywal, the tool that inspired the creation of wallust. + +## Parameters +### Alpha +Alpha value for templating (default: `100`). + +This value doesn't do anything other than represent the variable called `alpha` in templates. This is simply a left over of niche use cases. + +To edit this value: + +Config file: `alpha = 50` +Cli: `wallust run image.png --alpha 50` + +### Backend +Allows you to choose which method to use in order to parse the image. + +| Backends | Description | +| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Full | Read and return the whole image pixels (more precision, slower) | +| Resized | Resizes the image before parsing, mantaining it's aspect ratio | +| Wal | Uses image magick convert to generate the colors, like pywal | +| Thumb | Faster algo hardcoded to 512x512 (no ratio respected) | +| FastResize | A much faster resize algo that uses SIMD. For some reason it fails on some images where resized doesn't, for this reason it doesn't replace but rather it's a new option. | +| Kmeans | Kmeans is an algo that divides and picks pixels all around the image, giving a more diverse look. | + +To edit this value: + +Config file: `backend = "full"` +Cli: `wallust run image.png --backend full` + +### Check Constrast +Ensures a "readable contrast". Should only be enabled when you notice an unreadable contrast frequently happening with your images. The reference color for the contrast is the background color. (default: `disabled`) + +To edit this value: + +Config file: `check_contrast = true` +Cli: `wallust run image.png --check-contrast` + +### color_space +What colorspace to use to gather the most prominent colors. + +| Name | Description | +| ---- | --------------------------------------------------------------------------------------------------------------------------- | +| lab | Uses Cie L a b color space. (mixed and ansi) | +| lch | CIE Lch, you can understand this color space like LAB but with chrome and hue added, which Could help when sorting. (mixed) | + +There are two variants: + +- mixed, which mixes colors when collecting them into a histogram. +- ansi, Tries to get a full color pallete similar to the one of a tty, this works best with ansidark palette. + +Below, is a complete overview of all colorspaces variations: + +| Color Space | Description | +| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Lab | Uses Cie Lab color space | +| LabMixed | Variant of lab that mixes the colors gathered, if not enough colors it fallbacks to usual lab (not recommended in small images) | +| Lch | CIE Lch, you can understand this color space like LAB but with chrome and hue added. Could help when sorting. | +| LchMixed | CIE Lch, you can understand this color space like LAB but with chrome and hue added. Could help when sorting. | +| LchAnsi | Variant of Lch which preserves 8 colors: black, red, green, yellow, blue, magenta, cyan and gray. This works best with 'darkansi' palette, allowing a constant color order. | + +To edit this value: + +Config file: `color_space = "lchmixed"` +Cli: `wallust run image.png --colorspace lchmixed` + +### Enviromental Variables in templates/targets paths +Allows you to have shell variables in your paths. For example: +```toml +# using XDG var +pywal = { src = "pywal", dst = "${XDG_HOME_CONFIG}/templates/pywal-result/", pywal = true } +``` + +To avoid possible security issues, this flag is disabled by default. + +To edit this value: + +Config file: `env_vars = true` + +### Fallback Generator +This field chooses a method to use when the gathered colors aren't enough: + +| Name | Description | +| --------------- | ------------------------------------------------------------------------- | +| `interpolation` | (default) Tries to pick two colors and built gradients over them | +| `complementary` | Uses the complementary colors of two colors, or more (if needed), colors. | + +To edit this value: + +Config file: `fallback_generator = "complementary"` +Cli: `wallust run image.png --fallback-generator complementary` + +### Palette +Uses the colors gathered from `color_space` in a way that makes sense, resulting in a scheme palette. + +| Name | Description | +| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ansidark | Dark ansi colors, works best with lchansi and orders it's colors to preserve a constant tty like order: color0 -> black, color1 -> redish, color2 -> greenish, and so on. | +| dark | Dark colors dark background and light contrast. (16, comp, comp16) | +| harddark | Same as dark with hard hue colors. (16, comp, comp16) | +| light | Light bg dark fg. (16, comp, comp16) | +| softdark | Variant of softlight uses the lightest colors and a dark background could be interpreted as dark inversed. (16, comp, comp16) | +| softlight | Light with soft pastel colors counterpart of harddark. (16, comp, comp16) | + +**Palette Variations**: +There are some variants to the principal palettes schemes which you can use by appending the variant to the name e.g. 'dark16', 'lightcomp', 'harddarkcomp16' and so on, each palette indicates, in parenthesis, which variants are avaliable. + +| Name | Description | +| ------ | --------------------------------------------------------------------------------------------- | +| 16 | Makes shades of colors, creating the ilusion of 16 different colors. | +| comp | Stands for Complementary and completly changes the palette to it's complementary counterpart. | +| comp16 | Complementary palette with 16 shades, basically a combination of the above. | + +To edit this value: + +Config file: `palette = darkcomp16` +Cli: `wallust run image.png --palette darkcomp16` + +### Saturation +Color saturation, usually something higher than 50 increases the saturation and below decreases it (on a scheme with strong and vivid colors). + +Possible values: 1 - 100 (default: disabled) + +To edit this value: + +Config file: `saturate = 20` +Cli: `wallust run image.png --saturation 20` + +### Threshold +Wallust automatically uses the best threshold, heuristically, if this variable isn't defined (default behaviour). + +If you really want to define this variable, keep in mind the following. Thershold is the difference between similar colors , used inside the colorspace. + +Each colorspace may have different results with different thresholds, meaning you should try which one works for you best. + +An overall table looks like this: + +| Number | Description | +| ------- | -------------------------------------- | +| 1 | Not Perceptible by human eyes. | +| 1 - 2 | Perceptible through close observation. | +| 2 - 10 | Perceptible at a glance. | +| 11 - 49 | Colors are more similar than opposite. | +| 100 | Colors are exact opposite. | + +To edit this value: + +Config file: `threshold = 10` +Cli: `wallust run image.png --threshold 18` + +## Configuration +While wallust can work out without a config file, it results useful to define constant options in a file than giving them each time as a cli flag. This is why all parameters are optional. + +Without a config file, wallust will choose to default implementations. That being said, you can start editing your config file. + +The config file is divided into two parts: +- global space +- templates space +- +Inside the global space you can define any parameter that you want. + +To enter the templates space, however, requires a `[templates]` header. Below this, you can only define templates. + +### Defining a template in the config file +Templates are optional and defined inside the `[templates]` header. Here it's recommended to use single quotes (`'`) instead of double quotes (`"`) since the first one, by the toml format, ignores backslashes (`\`) as escape codes, allowing you to define Widows like paths, e.g. `C:\Users\Desktop\`. + +Template definitions have the following fields: +- `template` : A relative path that points to a file where wallust.toml is located, usually at ~/.config/wallust/templates. This file can also be a directory, which will be templated non-recursively (only the first recursion, like `du ... --max-depth 1`) +- `target` : Absolute path in which to place a file with generated templated values. This field CAN expand the ~ as the $HOME enviromental variable. If template is a directory, this must correspond and be one. + +Example: +```toml +# Let's keep good old pywal look and feel +backend = "wal" +#color_space = "lch" # idc about this one.. +#threshold = "20" # neither about this, since I read wallust does it automagically.. +# classic look +palette = "dark16" +# let's keep the contrast very very very clear. +check_contrast = true + +[templates] +# dunst templates +dunst.template = "dunstrc.monitor" +dunst.target = "~/.config/dunst/dunstrc" + +# one liner for zathura +zathura = { template = 'zath', target = '~/.config/zathura/zathurarc' } + +# even a shorter way +glava = { src = 'glava.glsl', dst = '~/.config/glava/rc.glsl' } + +# or splited in the dotted syntax +res.src = "xres" +res.dst = "~/.config/Xresources" + +# old times, good times. Here I put old pywal templates. +# NOTE THAT BOTH scr AND dst ARE DIRECTORIES! +pywal = { src = "templates/", dst = '~/.cache/wal/', pywal = true } +``` + +## Templates +A template is simply a file that has placeholders in order to replace them with values. In wallust case, these values can range from either the colors generated, the image/theme served or the backend used. These values are represented by variables, which you can look up inside placeholders. + +By using templates you can apply the colors to every program that uses a config file. + +There are some templates for some known programs [here](https://codeberg.org/explosion-mental/wallust-templates). If you have a template you want to share, that is the place. + +### Template Syntax +Here is an overview of the general syntax of a template. + +You reference variables in the following syntax: +``` +{{color0}} +``` + +For applying a filter you use the pipe character (`|`) like this: + +``` +{{background | strip}} +``` + +And if the filter requires an argument: + +``` +{{background | lighten(0.3)}} +``` + +Remember that filters require a valid type to apply to in these examples we are using colors, which can even be defined literally: + +``` +{{ "#4ff4ff" | lighten(0.3)}} +``` + +For both, being applied to or as an argument of a filter: + +``` +{{ color2 | blend("4ff4ff")}} +``` + +You can chain multiple filters, this is why the return type of the filter is important. + +``` +{# This will get a color without the initial '#', + 0.5 lighter than before and it's complementary variant. } +{{ color2 | strip | lighten(0.5) | complementary}} +``` + +If you need to write a literal `{{`, that doesn't references any variable, you can write literals inside the delimiters: + +``` +{{ "{{" }} {{ "}}" }} +``` + +You can also use control flow expressions with `{% %}` delimiters: + +``` +{% if backend == "wal" %} +I am using the '{{backend}}' backend, getting a pywal like scheme. +{% elif backend == "fastresize" %} +This backend is called "{{palette}}" and, uses SIMD optimizations and is so fast! +{% else %} +I don't care about any other backends. Be happy! +{% endif %} +``` + +Or inline them: + +``` +{{ "I'm using the kmeans algo!" if backend == "kmeans" else "Some backend is in use" }} +``` + +And yes, you can comment inside your template, the comments won't be rendered in the final target file: + +``` +{# This won't be visible! #} +``` + +There are more control flow instructions, like the for loop: + +``` +{# This will generate color0 = .. to color18, +since `colors` contains background, foreground and cursor variables #} +{% for c in colors %} +color{{- loop.index }} = {{c-}} +{% endfor %} +``` + +You can add a minus sign (`-`) at the start or the end of the delimiters to supress vertical spacing. + +The syntax comes from the library being used, which is minijinja, a subset of the template engine 'Jinja2'. + +### Template Variables +The color types are formated like HEX rgb (e.g. `#0A0B0C`) by default. However a color literal can be represented in multiple ways, like HEXA rgba (e.g. `#0A0B0CFF`, where `FF` is the transparency value) or HEX rgb without the leading `#` (`0a0b0c`). + +Avaliable values: + +- `color0` +- `color1` +- `color2` +- `color3` +- `color4` +- `color5` +- `color6` +- `color7` +- `color8` +- `color9` +- `color10` +- `color11` +- `color12` +- `color13` +- `color14` +- `color15` +- `background` +- `foreground` +- `cursor` +- `colors` + +Additionally, this variable `colors` returns a vector of all the presented colors in the following order: + +Starts with `color0` to `color15`, `background`, `foreground` and at the end, (index 18 if starting from 0), `cursor`. + +**Other avaliable variables:** + +- `wallpaper` : The full path to the current wallpaper, colorscheme file or the name of the theme in use. +- `backend` : Current backend being used. +- `colorspace` : Current colorspace being used. +- `palette` : Current palette being used. +- `alpha` : Default to 100, can be modified in the config file or with `--alpha/-a`. +- `alpha_dec` : Instead of 0 to 100, displays it from 0.00 to 1.00. + +### Template Filters +The Jinja2 format calls them 'filters', making a distincion from 'functions'. + +- `hexa` : Outputs the color in hexa format: e.g `#0A0B0CFF`, where `FF` is the alpha value. + +Example: + +``` +{{ color5 | hexa }} +``` + +- `rgb` : Output the color in rgb, separated by comas. (e.g. `10,11,12`) +- `xrgb` : Output the color in xrgb, separated by slashes. (e.g `0A/0B/0C`) +- `strip` : Output the color in hex, just like by default, but removes the leading #. (e.g. `0A0B0C`) +- `red` : Outputs only the red value. (e.g. `10`) +- `green` : Outputs only the green value. (e.g. `11`) +- `blue` : Outputs only the blue value. (e.g. `12`) +- `complementary` : Returns the respective complementary color. +- `blend` : Takes another color as input, to blend it for the filtered color. + +Example: + +``` +{{ color2 | blend(color0) | blend("#EEDDFF") }} +``` + +- `lighten` : Takes a float (decimal value) as input, from 0.1 to 1.0, that corresponds to the amount to lighten the color by. +Example: + +``` +{{ color0 | lighten(0.2) }} +``` + +- `darken` : Takes a float (decimal value) as input, from 0.1 to 1.0, that corresponds to the amount to darken the color by. +- `saturate` : Takes a float (decimal value) as input, from 0.1 to 1.0, that corresponds to the amount to saturate the color by. + +### zathurarc config sample +``` +# colors +set default-bg "{{background}}" + +# complementary foreground, but keep it light +set default-fg "{{foreground | complementary | lighten(0.5)}}" + +# make it a bit lighter than background +set statusbar-bg "{{background | lighten(0.3)}}" + +# make it darken by blending to a darken color +set statusbar-fg "{{foreground | blend("#eeeeee")}}" + +# use it's complementary +set inputbar-bg "{{background | complementary}}" +``` From 754f1a96b970e2a54818bd8925a691e302c37cc0 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Wed, 28 May 2025 09:47:23 +0200 Subject: [PATCH 72/99] add glance --- technology/applications/web/glance.md | 112 ++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 technology/applications/web/glance.md diff --git a/technology/applications/web/glance.md b/technology/applications/web/glance.md new file mode 100644 index 0000000..37cab19 --- /dev/null +++ b/technology/applications/web/glance.md @@ -0,0 +1,112 @@ +--- +obj: application +repo: https://github.com/glanceapp/glance +rev: 2025-05-28 +--- + +# glance +A self-hosted dashboard that puts all your feeds in one place. +The dashboard can be customized with various widgets. + +## Configuration +Configuration is done through YAML files, to learn more about how the layout works, how to add more pages and how to configure widgets, visit the [configuration documentation](https://github.com/glanceapp/glance/blob/main/docs/configuration.md). + +**Example config**: +```yml +pages: + - name: Home + columns: + - size: small + widgets: + - type: calendar + first-day-of-week: monday + + - type: rss + limit: 10 + collapse-after: 3 + cache: 12h + feeds: + - url: https://selfh.st/rss/ + title: selfh.st + limit: 4 + - url: https://ciechanow.ski/atom.xml + - url: https://www.joshwcomeau.com/rss.xml + title: Josh Comeau + - url: https://samwho.dev/rss.xml + - url: https://ishadeed.com/feed.xml + title: Ahmad Shadeed + + - type: twitch-channels + channels: + - theprimeagen + - j_blow + - piratesoftware + - cohhcarnage + - christitustech + - EJ_SA + + - size: full + widgets: + - type: group + widgets: + - type: hacker-news + - type: lobsters + + - type: videos + channels: + - UCXuqSBlHAE6Xw-yeJA0Tunw # Linus Tech Tips + - UCR-DXc1voovS8nhAvccRZhg # Jeff Geerling + - UCsBjURrPoezykLs9EqgamOA # Fireship + - UCBJycsmduvYEL83R_U4JriQ # Marques Brownlee + - UCHnyfMqiRRG1u-2MsSQLbXA # Veritasium + + - type: group + widgets: + - type: reddit + subreddit: technology + show-thumbnails: true + - type: reddit + subreddit: selfhosted + show-thumbnails: true + + - size: small + widgets: + - type: weather + location: London, United Kingdom + units: metric + hour-format: 12h + + - type: markets + markets: + - symbol: SPY + name: S&P 500 + - symbol: BTC-USD + name: Bitcoin + - symbol: NVDA + name: NVIDIA + - symbol: AAPL + name: Apple + - symbol: MSFT + name: Microsoft + + - type: releases + cache: 1d + repositories: + - glanceapp/glance + - go-gitea/gitea + - immich-app/immich + - syncthing/syncthing +``` + +## Compose +```yml +services: + glance: + container_name: glance + image: glanceapp/glance + restart: unless-stopped + volumes: + - ./glance.yml:/app/config/glance.yml + ports: + - 8080:8080 +``` From 0680af41e76d7358203269f0849859528fe43a47 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Mon, 2 Jun 2025 09:02:41 +0200 Subject: [PATCH 73/99] add sops --- technology/tools/sops.md | 123 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 technology/tools/sops.md diff --git a/technology/tools/sops.md b/technology/tools/sops.md new file mode 100644 index 0000000..4aa5000 --- /dev/null +++ b/technology/tools/sops.md @@ -0,0 +1,123 @@ +--- +obj: application +repo: https://github.com/getsops/sops +website: https://getsops.io +rev: 2025-06-02 +--- + +# SOPS: Secrets OPerationS +SOPS is an editor of encrypted files that supports YAML, JSON, ENV, INI and BINARY formats and encrypts with AWS KMS, GCP KMS, Azure Key Vault, age, and PGP. + +## Usage +```sh +# Edit a file +sops <file> + +# Decrypt a file +sops -d <file> + +# Example: kubectl +sops -d <file> | kubectl apply -f - +``` + +## Configuration +It is often tedious to specify the `--kms` `--gcp-kms` `--pgp` and `--age` parameters for creation of all new files. If your secrets are stored under a specific directory, like a git repository, you can create a `.sops.yaml` configuration file at the root directory to define which keys are used for which filename. + +> **Note**: The file needs to be named `.sops.yaml`. Other names (i.e. `.sops.yml`) won’t be automatically discovered by sops. You’ll need to pass the `--config .sops.yml` option for it to be picked up. + +When creating any file in the repository, whether at the root or under a subdirectory, SOPS will recursively look for a `.sops.yaml` file. If one is found, the filename of the file being created is compared with the filename regexes of the configuration file. The first regex that matches is selected, and its KMS and PGP keys are used to encrypt the file. It should be noted that the looking up of `.sops.yaml` is from the working directory (CWD) instead of the directory of the encrypting file. + +The `path_regex` checks the path of the encrypting file relative to the `.sops.yaml` config file. Here is an example: + +```yml +creation_rules: + # upon creation of a file under development, + # KMS set A is used + - path_regex: .*/development/.* + kms: 'arn:aws:kms:us-west-2:927034868273:key/fe86dd69-4132-404c-ab86-4269956b4500,arn:aws:kms:us-west-2:361527076523:key/5052f06a-5d3f-489e-b86c-57201e06f31e+arn:aws:iam::361527076523:role/hiera-sops-prod' + pgp: 'FBC7B9E2A4F9289AC0C1D4843D16CEE4A27381B4' + + # prod files use KMS set B in the PROD IAM + - path_regex: .*/production/.* + kms: 'arn:aws:kms:us-west-2:361527076523:key/5052f06a-5d3f-489e-b86c-57201e06f31e+arn:aws:iam::361527076523:role/hiera-sops-prod,arn:aws:kms:eu-central-1:361527076523:key/cb1fab90-8d17-42a1-a9d8-334968904f94+arn:aws:iam::361527076523:role/hiera-sops-prod' + pgp: 'FBC7B9E2A4F9289AC0C1D4843D16CEE4A27381B4' + + # other files use KMS set C + - kms: 'arn:aws:kms:us-west-2:927034868273:key/fe86dd69-4132-404c-ab86-4269956b4500,arn:aws:kms:us-west-2:142069644989:key/846cfb17-373d-49b9-8baf-f36b04512e47,arn:aws:kms:us-west-2:361527076523:key/5052f06a-5d3f-489e-b86c-57201e06f31e' + pgp: 'FBC7B9E2A4F9289AC0C1D4843D16CEE4A27381B4' +``` + +Example to encrypt all `secrets.yml`: +```yml +creation_rules: + - path_regex: secrets.yml + encrypted_regex: '^(data|stringData)$' + age: <age_key> +``` + +## Encrypting using age +age is a simple, modern, and secure tool for encrypting files. It's recommended to use age over PGP, if possible. + +You can encrypt a file for one or more age recipients (comma separated) using the `--age` option or the `$SOPS_AGE_RECIPIENTS` environment variable: + +``` +$ sops encrypt --age age1yt3tfqlfrwdwx0z0ynwplcr6qxcxfaqycuprpmy89nr83ltx74tqdpszlw test.yaml > test.enc.yaml +``` + +When decrypting a file with the corresponding identity, SOPS will look for a text file name `keys.txt` located in a sops subdirectory of your user configuration directory. On Linux, this would be `$XDG_CONFIG_HOME/sops/age/keys.txt`. On macOS, this would be `$HOME/Library/Application Support/sops/age/keys.txt`. On Windows, this would be `%AppData%\sops\age\keys.txt`. You can specify the location of this file manually by setting the environment variable `$SOPS_AGE_KEY_FILE`. Alternatively, you can provide the key(s) directly by setting the `$SOPS_AGE_KEY` environment variable. + +The contents of this key file should be a list of age X25519 identities, one per line. Lines beginning with `#` are considered comments and ignored. Each identity will be tried in sequence until one is able to decrypt the data. + +Encrypting with SSH keys via age is not yet supported by SOPS. + +## Showing diffs in cleartext in git +You most likely want to store encrypted files in a version controlled repository. SOPS can be used with git to decrypt files when showing diffs between versions. This is very handy for reviewing changes or visualizing history. + +To configure SOPS to decrypt files during diff, create a `.gitattributes` file at the root of your repository that contains a filter and a command. + +``` +*.yaml diff=sopsdiffer +``` + +Here we only care about YAML files. `sopsdiffer` is an arbitrary name that we map to a SOPS command in the git configuration file of the repository. + +``` +$ git config diff.sopsdiffer.textconv "sops decrypt" + +$ grep -A 1 sopsdiffer .git/config +[diff "sopsdiffer"] + textconv = "sops decrypt" +``` + +With this in place, calls to git diff will decrypt both previous and current versions of the target file prior to displaying the diff. And it even works with git client interfaces, because they call git diff under the hood! + +## Encrypting only parts of a file +> **Note**: this only works on YAML and JSON files, not on BINARY files. + +By default, SOPS encrypts all the values of a YAML or JSON file and leaves the keys in cleartext. In some instances, you may want to exclude some values from being encrypted. This can be accomplished by adding the suffix `_unencrypted` to any key of a file. When set, all values underneath the key that set the `_unencrypted` suffix will be left in cleartext. + +Note that, while in cleartext, unencrypted content is still added to the checksum of the file, and thus cannot be modified outside of SOPS without breaking the file integrity check. This behavior can be modified using `--mac-only-encrypted` flag or `.sops.yaml` config file which makes SOPS compute a MAC only over values it encrypted and not all values. + +The unencrypted suffix can be set to a different value using the `--unencrypted-suffix` option. + +Conversely, you can opt in to only encrypt some values in a YAML or JSON file, by adding a chosen suffix to those keys and passing it to the `--encrypted-suffix` option. + +A third method is to use the `--encrypted-regex` which will only encrypt values under keys that match the supplied regular expression. For example, this command: + +``` +$ sops encrypt --encrypted-regex '^(data|stringData)$' k8s-secrets.yaml +``` + +will encrypt the values under the `data` and `stringData` keys in a YAML file containing kubernetes secrets. It will not encrypt other values that help you to navigate the file, like metadata which contains the secrets' names. + +Conversely, you can opt in to only leave certain keys without encrypting by using the `--unencrypted-regex` option, which will leave the values unencrypted of those keys that match the supplied regular expression. For example, this command: + +``` +$ sops encrypt --unencrypted-regex '^(description|metadata)$' k8s-secrets.yaml +``` + +will not encrypt the values under the description and metadata keys in a YAML file containing kubernetes secrets, while encrypting everything else. + +For YAML files, another method is to use `--encrypted-comment-regex` which will only encrypt comments and values which have a preceding comment matching the supplied regular expression. + +Conversely, you can opt in to only left certain keys without encrypting by using the `--unencrypted-comment-regex` option, which will leave the values and comments unencrypted when they have a preeceding comment, or a trailing comment on the same line, that matches the supplied regular expression. From 16fc862ddba22e869ecc998768383a6ae5b96835 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Wed, 4 Jun 2025 21:41:59 +0200 Subject: [PATCH 74/99] add mangohud --- technology/applications/gaming/MangoHUD.md | 79 ++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 technology/applications/gaming/MangoHUD.md diff --git a/technology/applications/gaming/MangoHUD.md b/technology/applications/gaming/MangoHUD.md new file mode 100644 index 0000000..2a6a7f4 --- /dev/null +++ b/technology/applications/gaming/MangoHUD.md @@ -0,0 +1,79 @@ +--- +obj: application +repo: https://github.com/flightlessmango/MangoHud +arch-wiki: https://wiki.archlinux.org/title/MangoHud +--- + +# MangoHUD +MangoHud is a Vulkan and OpenGL overlay for monitoring system performance while inside applications and to record metrics for benchmarking. + +## Configuration +MangoHud is configured via the following files, which are read in the following order: + +- `$XDG_CONFIG_HOME/MangoHud/MangoHud.conf` +- `$XDG_CONFIG_HOME/MangoHud/APPLICATION-NAME.conf` (case-sensitive) +- `$XDG_CONFIG_HOME/MangoHud/wine-APPLICATION-NAME.conf` (for Wine applications, case-sensitive, without the .exe extension) +- `./MangoHud.conf` +- `$MANGOHUD_CONFIGFILE` (via environment variables) + +> Tip: An example configuration file with comments can be found in the project's repository. + +## Usage +### Keyboard commands +- `RShift+F12` – Toggle overlay +- `RShift+F11` – Change overlay position +- `RShift+F10` – Toggle preset +- `LShift+F2` – Toggle logging +- `LShift+F4` – Reload config + +### Test configuration +Verify if the program has been setup correctly: + +``` +$ mangohud glxgears +$ mangohud vkcube +``` + +### Run a single game +To run a game with MangoHud start it like this: + +``` +$ mangohud game +``` + +### Dynamic hooking +Certain applications may require a special type of hooking, which can be specified via the `--dlsym` parameter or the `MANGOHUD_DLSYM` environment variable: + +``` +$ mangohud --dlsym game +``` + +### Use with GameMode +To launch a game with both MangoHud and GameMode, chain the two commands into a single one, like this: + +``` +$ mangohud gamemoderun game +``` + +### Run a single steam game +To make Steam start a game with MangoHud, right click the game in the Library, select Properties..., then in the Launch Options text box enter: + +``` +mangohud %command% +``` + +### Run Steam with MangoHud +To avoid having to change launch options for all games, you may launch Steam directly with MangoHud: + +``` +$ mangohud steam-runtime +``` + +MangoHud will detect Steam and will avoid loading itself until a game is launched. + +### Enable for all Vulkan games +To make MangoHud automatically launch with all Vulkan games, it is possible to set the following environment variable: + +``` +MANGOHUD=1 +``` From c12fdfc9d516b7e7f1c75c018cc943f7efdb4a48 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Thu, 5 Jun 2025 10:56:23 +0200 Subject: [PATCH 75/99] add uv --- technology/applications/development/uv.md | 238 ++++++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 technology/applications/development/uv.md diff --git a/technology/applications/development/uv.md b/technology/applications/development/uv.md new file mode 100644 index 0000000..d197432 --- /dev/null +++ b/technology/applications/development/uv.md @@ -0,0 +1,238 @@ +--- +obj: application +repo: https://github.com/astral-sh/uv +website: https://docs.astral.sh/uv +rev: 2025-06-05 +--- + +# 🚀 `uv` – Python Package and Project Manager +`uv` is a high-performance Python package manager and project toolchain, written in Rust. It consolidates functionalities from multiple tools into a single, fast, and efficient interface, aiming to replace `pip`, `pipx`, `poetry`, `pyenv`, `virtualenv`, `pip-tools`, `twine`, and more. + +## 🔧 Key Features + +* **Unified Tooling:** Combines functionalities of multiple tools into one. +* **Blazing Fast:** 10–100x faster than `pip`. +* **Cross-Platform:** Supports macOS, Linux, and Windows. +* **Minimal Dependencies:** Single binary with no external dependencies. +* **Comprehensive Project Management:** Handles `pyproject.toml`, lockfiles, and more. +* **Python Version Management:** Install and manage multiple Python versions. +* **Tool Installation:** Install and run Python-based tools like `ruff`, `black`, etc. +* **Script Execution:** Run standalone Python scripts with inline dependencies. + +## ⚙️ Usage + +### Python Version Management + +* **Install Python Versions:** + + ```bash + uv python install 3.10.7 + ``` + +* **List Installed Versions:** + + ```bash + uv python list + ``` + +* **Pin Python Version for Project:** + + ```bash + uv python pin 3.10.7 + ``` + +* **Uninstall Python Version:** + + ```bash + uv python uninstall 3.10.7 + ``` + +### Virtual Environments + +* **Create a Virtual Environment:** + + ```bash + uv venv + ``` + +* **Create with Specific Python Version:** + + ```bash + uv venv --python 3.10 + ``` + +* **Activate the Environment:** + + ```bash + source .venv/bin/activate # macOS/Linux + .venv\Scripts\activate # Windows + ``` + +* **Install Dependencies:** + + ```bash + uv pip install -r requirements.txt + ``` + +* **Freeze Installed Packages:** + + ```bash + uv pip freeze > requirements.txt + ``` + +### Project Management + +* **Initialize a New Project:** + + ```bash + uv init my-project + ``` + +* **Add a Dependency:** + + ```bash + uv add requests + ``` + +* **Remove a Dependency:** + + ```bash + uv remove requests + ``` + +* **Sync Dependencies:** + + ```bash + uv sync + ``` + +* **Generate Lockfile:** + + ```bash + uv lock + ``` + +* **Run Project Scripts:** + + ```bash + uv run script.py + ``` + +* **Build Project:** + + ```bash + uv build + ``` + +* **Publish Project:** + + ```bash + uv publish + ``` + +### Tool Management + +* **Install a Tool:** + + ```bash + uv tool install black + ``` + +* **Uninstall a Tool:** + + ```bash + uv tool uninstall black + ``` + +* **Run a Tool:** + + ```bash + uv tool run black . + ``` + +* **List Installed Tools:** + + ```bash + uv tool list + ``` + + +### Running Python Scripts with Inline Dependencies +#### **Add Inline Metadata to Your Script** +To begin, you'll need to add metadata to your Python script to specify the required dependencies and Python version. This can be done using the `uv add --script` command: + +```bash +uv add --script your_script.py 'requests' 'numpy' +``` + +This command will modify your script to include a special comment block at the top, indicating the dependencies: + +```python +# /// script +# requires-python = ">=3.12" +# dependencies = [ +# "requests", +# "numpy", +# ] +# /// +``` + +#### **Make the Script Executable** +To run your script directly from the command line, add a shebang line at the very top of your script: + +```python +#!/usr/bin/env -S uv run --script +``` + +Ensure the script is executable: + +```bash +chmod +x your_script.py +``` + +#### **Run the Script** +Now, you can execute your script directly: +```bash +./your_script.py +``` + +The first time you run it, `uv` will create an isolated virtual environment, install the specified dependencies, and execute the script. On subsequent runs, the environment is cached, leading to near-instant execution times . + +## 📦 Compatibility with Existing Tools +`uv` is designed to be compatible with existing Python tools and workflows: + +* **`pyproject.toml` Support:** Fully supports PEP 621-compliant `pyproject.toml` files. +* **`requirements.txt` Compatibility:** Works seamlessly with `requirements.txt` files. +* **`pip` Interface:** Provides a familiar `pip`-like interface for package management. +* **`pipx` Replacement:** Can install and run Python-based tools globally, replacing `pipx`. +* **`pyenv` Alternative:** Manages multiple Python versions without the need for `pyenv`. + +## 🧪 Example +Here's a typical workflow using `uv`: + +```bash +# Initialize a new project +uv init my-project + +# Navigate into the project directory +cd my-project + +# Create a virtual environment +uv venv + +# Activate the environment +source .venv/bin/activate # macOS/Linux +.venv\Scripts\activate # Windows + +# Add dependencies +uv add requests + +# Generate lockfile +uv lock + +# Install dependencies +uv sync + +# Run the project script +uv run script.py +``` From ecb2d9b3198fe966c4432b9abcfde1137f13909f Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Mon, 9 Jun 2025 00:39:02 +0200 Subject: [PATCH 76/99] fix --- technology/files/MIME.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/technology/files/MIME.md b/technology/files/MIME.md index 1364534..da46b57 100644 --- a/technology/files/MIME.md +++ b/technology/files/MIME.md @@ -3,6 +3,7 @@ obj: concept --- # MIME Type + A media type (also known as a MIME type) is a two-part identifier for file formats and format contents transmitted on the Internet. The Internet Assigned Numbers Authority (IANA) is the official authority for the standardization and publication of these classifications. Media types were originally defined in Request for Comments RFC 2045 (MIME) Part One: Format of Internet Message Bodies (Nov 1996) in November 1996 as a part of MIME (Multipurpose Internet Mail Extensions) specification, for denoting type of [email](../internet/eMail.md) message content and attachments; hence the original name, MIME type. Media types are also used by other internet protocols such as [HTTP](../internet/HTTP.md) and document file formats such as [HTML](../internet/HTML.md), for similar purposes. A list of supported MIME Types can be found at `/etc/mime.types` @@ -22,7 +23,9 @@ A subtype typically consists of a media format, but it may or must also contain Types, subtypes, and parameter names are case-insensitive. Parameter values are usually case-sensitive, but may be interpreted in a case-insensitive fashion depending on the intended use. ## Common MIME Types Files + ### Application + | MIME Type | Extensions | Description | | ------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------------- | | `application/epub+zip` | `.epub` | Electronic Publication (eBook) | @@ -73,6 +76,7 @@ Types, subtypes, and parameter names are case-insensitive. Parameter values are | `application/yaml` | `.yaml`, `.yml` | [YAML](YAML.md) | ### Audio + | MIME Type | Extensions | Description | | ----------------- | --------------- | ----------------------------------- | | `audio/aac` | `.adts`, `.aac` | AAC Audio | @@ -89,6 +93,7 @@ Types, subtypes, and parameter names are case-insensitive. Parameter values are | `audio/x-mpegurl` | `.m3u`, `.m3u8` | [Playlist File](media/m3u.md) | ### Font + | MIME Type | Extensions | Description | | ----------- | ---------- | -------------------- | | `font/ttf` | `.ttf` | TrueType Font | @@ -96,6 +101,7 @@ Types, subtypes, and parameter names are case-insensitive. Parameter values are | `font/woff` | `.woff` | Web Open Font Format | ### Image + | MIME Type | Extensions | Description | | --------------- | --------------- | -------------------------------------------------------- | | `image/heif` | `.heif` | HEIF Image | @@ -112,6 +118,7 @@ Types, subtypes, and parameter names are case-insensitive. Parameter values are | `image/x-xcf` | `.xcf` | XCF Image ([GIMP](../applications/media/images/GIMP.md)) | ### Message + | MIME Type | Extensions | Description | | ------------------------- | ---------- | -------------------------------------------- | | `message/delivery-status` | - | - | @@ -120,12 +127,14 @@ Types, subtypes, and parameter names are case-insensitive. Parameter values are | `message/rfc822` | `.eml` | [eMail Message](Electronic%20Mail%20File.md) | ### Model + | MIME Type | Extensions | Description | | ------------ | ------------------------ | ----------- | | `model/mesh` | `.msh`, `.mesh`, `.silo` | 3D Mesh | | `model/obj` | `.obj` | 3D Object | ### Multipart + | MIME Type | Extensions | Description | | --------------------- | ---------- | ----------- | | `multipart/digest` | - | - | @@ -134,6 +143,7 @@ Types, subtypes, and parameter names are case-insensitive. Parameter values are | `multipart/parallel` | - | - | ### Text + | MIME Type | Extensions | Description | | ---------------- | ------------------------------------------------ | --------------------------------------------------------------------------------------- | | `text/calendar` | `.ics` | [Calendar](iCalendar.md) | @@ -145,7 +155,7 @@ Types, subtypes, and parameter names are case-insensitive. Parameter values are | `text/markdown` | `.markdown`, `.md` | [Markdown](Markdown.md) | | `text/plain` | `.txt`, `.text`, `.conf` | Plain Text | | `text/plain` | `.asc` | [ASCII](ASCII.md) (Armored) File | -| `text/plain` | `.log` | [Log Files](../dev/Log) | +| `text/plain` | `.log` | [Log Files](../dev/Log.md) | | `text/plain` | `.diff` | Diff File ([diff](../applications/cli/diff.md) / [patch](../applications/cli/patch.md)) | | `text/plain` | `.lrc` | [LRC](LRC.md) (Lyrics) File | | `text/plain` | `.nfo` | Information File | @@ -157,6 +167,7 @@ Types, subtypes, and parameter names are case-insensitive. Parameter values are | `text/uri-list` | `.uri`, `.uris`, `.urls` | List with [URLs](../internet/URL.md) | ### Video + | MIME Type | Extensions | Description | | ----------------- | -------------- | ----------------------------- | | `video/AV1` | - | [AV1](media/video/AV1.md) | From 0d26df997e4d1d28273a124faf9cc8de7120e034 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Wed, 11 Jun 2025 08:09:09 +0200 Subject: [PATCH 77/99] add surrealdb --- .../applications/development/SurrealDB.md | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 technology/applications/development/SurrealDB.md diff --git a/technology/applications/development/SurrealDB.md b/technology/applications/development/SurrealDB.md new file mode 100644 index 0000000..8606be9 --- /dev/null +++ b/technology/applications/development/SurrealDB.md @@ -0,0 +1,49 @@ +--- +obj: application +website: https://surrealdb.com +repo: https://github.com/surrealdb/surrealdb +--- + +# SurrealDB +SurrealDB is a powerful, cloud-native, multi-model database built for modern application development. It supports relational, document, graph, vector, and real-time data access, all via a unified SQL-like query language called SurrealQL. There is also a GUI called Surrealist. + +## Multi-Model Support +- **Relational**: Traditional table structure with foreign key-like linking. +- **Document**: JSON-based records with schema-less flexibility. +- **Graph**: Native support for linked data using edges and nodes. +- **Vector**: Built-in similarity search for AI/ML use cases. +- **Real-time**: Subscriptions and change feeds. +- **Time-Series & Search**: Native support for time-ordered and full-text queries. + +## SurrealQL +SurrealQL blends the familiarity of SQL with document/graph features. + +```sql +-- Create a user +CREATE user:john SET name = 'John Doe', email = 'john@example.com'; + +-- Read a record +SELECT * FROM user:john; + +-- Create a relationship (graph) +RELATE user:john->friend->user:jane; + +-- Search by text +SELECT * FROM article WHERE content CONTAINS 'database'; + +-- Vector similarity search +SELECT * FROM embeddings WHERE vector <-> [0.1, 0.2, 0.3] LIMIT 3; +``` + +## Compose + +```yml +services: + surrealdb: + ports: + - 80:8000 + volumes: + - /local-dir:/container-dir + image: surrealdb/surrealdb:latest + command: start --user root --pass root rocksdb:/container-dir/mydatabase.db +``` From 49156024e8104e68f6e2eb0ab40566f766093173 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Thu, 12 Jun 2025 22:55:59 +0200 Subject: [PATCH 78/99] update rust: add facet --- technology/dev/programming/languages/Rust.md | 1 + 1 file changed, 1 insertion(+) diff --git a/technology/dev/programming/languages/Rust.md b/technology/dev/programming/languages/Rust.md index 27ed117..5f83ce7 100644 --- a/technology/dev/programming/languages/Rust.md +++ b/technology/dev/programming/languages/Rust.md @@ -1022,6 +1022,7 @@ Currently, all supported targets follow the assembly code syntax used by LLVM's - [json-patch](https://lib.rs/crates/json-patch): RFC 6902, JavaScript Object Notation (JSON) Patch - [rss](https://lib.rs/crates/rss): Library for serializing the RSS web content syndication format - [postcard](https://lib.rs/crates/postcard): A no_std + serde compatible message library for Rust +- [facet](https://lib.rs/crates/facet): facet provides reflection for Rust: it gives types a SHAPE associated const with details on the layout, fields, doc comments, attributes, etc. It can be used for many things, from (de)serialization to pretty-printing, rich debuggers, CLI parsing, reflection in templating engines, code generation, etc. ### Encoding - [hex](https://lib.rs/crates/hex): Encoding and decoding data into/from hexadecimal representation From 67b453216b42c9f1968fefb2fe4149b7d5b08411 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Thu, 12 Jun 2025 23:13:11 +0200 Subject: [PATCH 79/99] add valkey --- technology/applications/development/valkey.md | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 technology/applications/development/valkey.md diff --git a/technology/applications/development/valkey.md b/technology/applications/development/valkey.md new file mode 100644 index 0000000..4cdae5c --- /dev/null +++ b/technology/applications/development/valkey.md @@ -0,0 +1,39 @@ +--- +obj: application +website: https://valkey.io +repo: https://github.com/valkey-io/valkey +--- + +# Valkey + +**Valkey** is a high-performance, in-memory key-value data store and cache that is fully open source and community-driven. It is a hard fork of Redis, created and maintained by the open-source community after concerns arose about Redis' license change (from BSD to SSPL). + +Valkey maintains full compatibility with Redis as of version 7.2 and continues to support core Redis features such as data structures, replication, persistence, clustering, and Lua scripting. Its primary goal is to offer a drop-in replacement with a transparent development process, ensuring long-term freedom and reliability for developers and organizations. + +## Key Features + +- ⚡ **In-Memory Speed**: Extremely fast data access due to in-memory storage. +- 🧱 **Rich Data Structures**: Strings, Lists, Sets, Sorted Sets, Hashes, Bitmaps, HyperLogLogs, Streams. +- 📜 **Lua Scripting**: Supports server-side scripting with Lua for atomic operations. +- 🧩 **Modules Support**: Supports Redis modules (as of 7.2 compatibility). +- 🔁 **Replication**: Built-in master-replica replication for high availability. +- 💾 **Persistence Options**: RDB snapshots and AOF (Append-Only File) for durability. +- 🔄 **Pub/Sub Messaging**: Lightweight publish/subscribe mechanism for message broadcasting. +- 📡 **Clustering**: Built-in support for sharded cluster mode. + +## Compose + +```yaml +version: '3.8' + +services: + valkey: + image: valkey/valkey:latest + container_name: valkey + ports: + - "6379:6379" + volumes: + - ./valkey_data:/data + restart: unless-stopped + command: valkey-server --appendonly yes +``` From 0de7c0c27c53d093c71bb51433fe37ffffb11ede Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Thu, 12 Jun 2025 23:17:04 +0200 Subject: [PATCH 80/99] add owncast --- technology/applications/web/owncast.md | 64 ++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 technology/applications/web/owncast.md diff --git a/technology/applications/web/owncast.md b/technology/applications/web/owncast.md new file mode 100644 index 0000000..68aac29 --- /dev/null +++ b/technology/applications/web/owncast.md @@ -0,0 +1,64 @@ +--- +obj: application +website: https://owncast.online +repo: https://github.com/owncast/owncast +--- + +# ownCast + +**Owncast** is an open-source, self-hosted live video and web chat server. It allows anyone to run their own streaming platform similar to Twitch or YouTube Live — without relying on centralized services. Whether you're streaming games, music, art, or hosting online events, Owncast provides you with full control over your content and audience experience. + +## 🚀 Key Features + +* **Live Video Streaming** + Stream using standard broadcasting software like OBS Studio, directly to your Owncast server using RTMP. + +* **Integrated Web Chat** + Built-in, real-time chat with emoji, moderation tools, and custom branding options. + +* **Web Interface** + A responsive, customizable frontend for viewers, including live status, video, chat, and stream details. + +* **Federation** + Supports ActivityPub to interact with Fediverse platforms like Mastodon — followers can get stream notifications and interact directly from their accounts. + +* **Analytics Dashboard** + Provides stream statistics, viewer counts, and chat activity for monitoring performance and engagement. + +* **Custom Branding** + Modify logos, color themes, titles, descriptions, and more for a personalized experience. + +* **Plugins and Integrations** + Extend functionality using community-developed or custom plugins via [owncast/extensions](https://github.com/owncast/extensions). + +## 🎙 Broadcasting to Owncast + +To broadcast: + +1. Open your streaming software (OBS, etc.) +2. Set **Stream URL** to your Owncast server’s RTMP endpoint (e.g., `rtmp://yourdomain.com/live`) +3. Set **Stream Key** to the value configured in Owncast's admin panel +4. Start streaming! + +## ⚙ Configuration + +After setup, visit the **Admin Panel** at `http://yourdomain.com/admin`: + +* Change stream key, server name, description +* Manage chat settings and moderation tools +* Configure federation and stream notifications +* Customize branding and stream appearance + +## Compose + +```yml +version: "3" +services: + owncast: + image: owncast/owncast:latest + ports: + - "8080:8080" + - "1935:1935" + volumes: + - ./data:/app/data +``` From 4d96dd8987799a1a3e356755fc8a9399f5abc1ac Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Fri, 13 Jun 2025 10:10:50 +0200 Subject: [PATCH 81/99] add dioxus --- .../dev/programming/frameworks/Dioxus.md | 229 ++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 technology/dev/programming/frameworks/Dioxus.md diff --git a/technology/dev/programming/frameworks/Dioxus.md b/technology/dev/programming/frameworks/Dioxus.md new file mode 100644 index 0000000..9f77faf --- /dev/null +++ b/technology/dev/programming/frameworks/Dioxus.md @@ -0,0 +1,229 @@ +--- +obj: concept +website: https://dioxuslabs.com +repo: https://github.com/dioxuslabs/dioxus +--- + +# Dioxus +Dioxus is a modern, ergonomic, and high-performance Rust framework for building user interfaces using a Virtual DOM (like React). It supports Web, Desktop, TUI, and Mobile targets using a unified component model. + +## Application +A dioxus app is just a normal rust application. To get started depend on `dioxus` and start with this `main.rs`: + +```rust +use dioxus::prelude::*; + +fn main() { + dioxus::launch(App); +} + +#[component] +pub fn App() -> Element { + rsx! { + p { "Hello World!" } + } +} +``` + +## Components (RSX) + +Dioxus components are Rust functions that return `Element` and use the `rsx!` macro (similar to JSX). The UI is made with HTML and CSS. + +```rust +use dioxus::prelude::*; + +#[component] +fn App() -> Element { + rsx! { + div { + h1 { "Hello, Dioxus!" } + } + } +} +``` + +You can define your own components and take values (Props): + +```rust + +#[component] +fn MyComp(value: String, myevent: EventHandler<MouseEvent>, children: Element) -> Element { + rsx! { + button { + onclick: myevent, + title: value, + {children} + } + } +} + +// Usage +#[component] +fn App() -> Element { + rsx! { + MyComp { + // Event Handler + onclick: move |_| { println!("Clicked"); }, + // Value + title: "my_title", + // children + p { + "Hello World" + } + } + } +} + +``` + +### Event Handler + +Event handling is done inline using closures: + +```rust +rsx!( + button { + onclick: move |_| println!("Button clicked"), + "Click me" + } +) +``` + +Each event handler receives an event struct (e.g., `MouseEvent`, `FormEvent`). + +## Hooks + +Dioxus has a powerful hook system that allows you to manage state, side effects, and asynchronous operations in your components. With these hooks the UI gets automatically reloaded when needed. + +> **Warning**: Always call the hooks in the same order or they will not work correctly. This means no hooks in loops or conditions. + +### `use_signal` + +Creates a reactive value that can be read and updated. When the value changes, the component re-renders. + +```rust +let count = use_signal(|| 0); +rsx! { + button { onclick: move |_| count.set(count() + 1), "Increment" } + p { "Value is {count}" } +} +``` + +### `use_memo` + +Computes a derived value that only re-evaluates when its dependencies change. + +```rust +let doubled = use_memo(|| count() * 2); +``` + +### `use_effect` + +Runs a side effect after the component renders. Useful for operations which should run beside the UI. + +```rust +use_effect(|| { + // Side effect code here +}); +``` + +### `use_resource` + +Manages an asynchronous resource, such as data fetched from an API. + +```rust +let resource = use_resource(|| fetch_data()); +``` + +### `use_drop` + +Registers a callback to be run before the component is removed. Useful for cleaning up side effects. + +```rust +use_drop(|| { + // Cleanup code here +}); +``` + +## Assets +To include assets (like CSS) in our app, you can use the `asset!()` macro. This macro ensures the asset will be included in the final app bundle. + +```rust +static MY_CSS: Asset = asset!("/assets/main.css"); + +fn App() -> Element { + rsx! { + document::Stylesheet { href: MY_CSS } + } +} +``` + +## Routing + +You can have different routes in your app using dioxus router. To use the router enable the `router` feature in the `dioxus` crate. + +**Define the routes**: + +```rust +// All of our routes will be a variant of this Route enum +#[derive(Routable, PartialEq, Clone)] +enum Route { + // if the current location is "/home", render the Home component + #[route("/home")] + Home {}, + // if the current location is "/blog", render the Blog component + #[route("/blog")] + Blog {}, +} + +fn Home() -> Element { + todo!() +} + +fn Blog() -> Element { + todo!() +} +``` + +To use the router and actually render the routes, add it to your main App component: +```rust +fn App() -> Element { + rsx! { + document::Stylesheet { href: asset!("/assets/main.css") } + + // Renders the current route + Router::<Route> {} + } +} +``` + +To move between routes you can either use a `Link` element or the `navigator`: + +```rust +// Link Element +rsx! { + Link { to: Route::Home {}, "Go home!" } +} + +// Navigator +rsx! { + button { + onclick: move |_| { + let nav = navigator(); + + // push + nav.push(Route::Blog {}); + + // replace + nav.replace(Route::Home {}); + + // go back + nav.go_back(); + + // go forward + nav.go_forward(); + }, + "Go somewhere" + } +} +``` From 683e17f76f3f96ac80e2c30b004bb7bb6c332e1b Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Fri, 13 Jun 2025 11:32:52 +0200 Subject: [PATCH 82/99] add bevy --- technology/dev/programming/frameworks/Bevy.md | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 technology/dev/programming/frameworks/Bevy.md diff --git a/technology/dev/programming/frameworks/Bevy.md b/technology/dev/programming/frameworks/Bevy.md new file mode 100644 index 0000000..bc08d6b --- /dev/null +++ b/technology/dev/programming/frameworks/Bevy.md @@ -0,0 +1,42 @@ +--- +obj: concept +website: https://bevyengine.org +repo: https://github.com/bevyengine/bevy +--- + +# Bevy Engine +Bevy is a modern, open-source game engine built in **Rust**. It emphasizes simplicity, modularity, and performance, making it an attractive choice for game developers looking for a data-driven, Entity-Component-System (ECS) architecture combined with modern rendering capabilities. + +## Entity Component System (ECS) + +* **Entity:** Unique identifier representing a game object. +* **Component:** Plain data attached to entities. +* **System:** Logic operating on entities with matching components, executed in parallel where possible. + +This design promotes separation of data and logic, enabling highly efficient, cache-friendly processing. + +## Basic Example + +A simple example creating a window and spawning a 2D sprite: + +```rust +use bevy::prelude::*; + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_startup_system(setup) + .run(); +} + +fn setup(mut commands: Commands, asset_server: Res<AssetServer>) { + // Camera + commands.spawn(Camera2dBundle::default()); + + // Sprite + commands.spawn(SpriteBundle { + texture: asset_server.load("branding/icon.png"), + ..Default::default() + }); +} +``` From 5a461eb9be63e355a5e7fa69f662c63640d29949 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Fri, 13 Jun 2025 11:33:35 +0200 Subject: [PATCH 83/99] update development --- technology/dev/Development.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/technology/dev/Development.md b/technology/dev/Development.md index caf70f4..90eaa66 100644 --- a/technology/dev/Development.md +++ b/technology/dev/Development.md @@ -1,7 +1,7 @@ --- tags: ["meta"] obj: meta/collection -rev: 2024-06-19 +rev: 2025-06-10 --- # Development @@ -17,6 +17,12 @@ rev: 2024-06-19 - [Flutter](./programming/frameworks/Flutter.md) - [Godot Game Engine](./programming/Godot.md) - [Rocket](./programming/frameworks/Rocket.md) +- [Dioxus](./programming/frameworks/Dioxus.md) +- [Bevy](./programming/frameworks/Bevy.md) ## Tools -- [Git](Git.md) \ No newline at end of file +- [Git](Git.md) +- [Material Icons](./Material%20Icons.md) +- [sops](../tools/sops.md) +- [cargo](../applications/development/cargo.md) +- [uv](../applications/development/uv.md) From b64b47ebd58c8d719e56f6d0ec68a28861c80fc2 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Sat, 14 Jun 2025 01:51:25 +0200 Subject: [PATCH 84/99] add ntfy --- technology/applications/web/ntfy.md | 673 ++++++++++++++++++++++++++++ 1 file changed, 673 insertions(+) create mode 100644 technology/applications/web/ntfy.md diff --git a/technology/applications/web/ntfy.md b/technology/applications/web/ntfy.md new file mode 100644 index 0000000..381d0c1 --- /dev/null +++ b/technology/applications/web/ntfy.md @@ -0,0 +1,673 @@ +--- +obj: application +website: https://ntfy.sh +repo: https://github.com/binwiederhier/ntfy +--- + +# ntfy +ntfy (pronounced "notify") is a simple HTTP-based pub-sub notification service. With ntfy, you can send notifications to your phone or desktop via scripts from any computer. + +## Publishing +Publishing messages can be done via HTTP PUT/POST or via the ntfy CLI. Topics are created on the fly by subscribing or publishing to them. Because there is no sign-up, **the topic is essentially a password**, so pick something that's not easily guessable. + +Here's an example showing how to publish a simple message using a POST request: + +```sh +# Command line (curl): +curl -d "Backup successful 😀" ntfy.sh/mytopic + +# ntfy CLI +ntfy publish mytopic "Backup successful 😀" +``` + +### Message title +The notification title is typically set to the topic short URL (e.g. `ntfy.sh/mytopic`). To override the title, you can set the `X-Title` header (or any of its aliases: `Title`, `ti`, or `t`). + +```sh +curl -H "X-Title: Dogs are better than cats" -d "Oh my ..." ntfy.sh/controversial +curl -H "Title: Dogs are better than cats" -d "Oh my ..." ntfy.sh/controversial +curl -H "t: Dogs are better than cats" -d "Oh my ..." ntfy.sh/controversial + +ntfy publish \ + -t "Dogs are better than cats" \ + controversial "Oh my ..." +``` + +### Message priority +All messages have a priority, which defines how urgently your phone notifies you. On Android, you can set custom notification sounds and vibration patterns on your phone to map to these priorities. + +The following priorities exist: + +| Priority | ID | Name | Description | +| -------------------- | --- | -------------- | ------------------------------------------------------------------------------------------------------ | +| Max priority | `5` | `max`/`urgent` | Really long vibration bursts, default notification sound with a pop-over notification. | +| High priority | `4` | `high` | Long vibration burst, default notification sound with a pop-over notification. | +| **Default priority** | `3` | `default` | Short default vibration and sound. Default notification behavior. | +| Low priority | `2` | `low` | No vibration or sound. Notification will not visibly show up until notification drawer is pulled down. | +| Min priority | `1` | `min` | No vibration or sound. The notification will be under the fold in "Other notifications". | + +You can set the priority with the header `X-Priority` (or any of its aliases: `Priority`, `prio`, or `p`). + +``` +curl -H "X-Priority: 5" -d "An urgent message" ntfy.sh/phil_alerts +curl -H "Priority: low" -d "Low priority message" ntfy.sh/phil_alerts +curl -H p:4 -d "A high priority message" ntfy.sh/phil_alerts + +ntfy publish \ + -p 5 \ + phil_alerts An urgent message +``` + +## Tags & emojis 🥳 🎉 +You can tag messages with emojis and other relevant strings: + +* **Emojis**: If a tag matches an emoji short code, it'll be converted to an emoji and prepended to title or message. +* **Other tags:** If a tag doesn't match, it will be listed below the notification. + +This feature is useful for things like warnings (⚠️, ️🚨, or 🚩), but also to simply tag messages otherwise (e.g. script names, hostnames, etc.). Use the emoji short code list to figure out what tags can be converted to emojis. +Here's an **excerpt of emojis** I've found very useful in alert messages: + +<table class="remove-md-box"><tr> +<td> + <table><thead><tr><th>Tag</th><th>Emoji</th></tr></thead><tbody> + <tr><td><code>+1</code></td><td>👍</td></tr> + <tr><td><code>partying_face</code></td><td>🥳</td></tr> + <tr><td><code>tada</code></td><td>🎉</td></tr> + <tr><td><code>heavy_check_mark</code></td><td>✔️</td></tr> + <tr><td><code>loudspeaker</code></td><td>📢</td></tr> + <tr><td>...</td><td>...</td></tr> + </tbody></table> +</td> +<td> + <table><thead><tr><th>Tag</th><th>Emoji</th></tr></thead><tbody> + <tr><td><code>-1</code></td><td>👎️</td></tr> + <tr><td><code>warning</code></td><td>⚠️</td></tr> + <tr><td><code>rotating_light</code></td><td>️🚨</td></tr> + <tr><td><code>triangular_flag_on_post</code></td><td>🚩</td></tr> + <tr><td><code>skull</code></td><td>💀</td></tr> + <tr><td>...</td><td>...</td></tr> + </tbody></table> +</td> +<td> + <table><thead><tr><th>Tag</th><th>Emoji</th></tr></thead><tbody> + <tr><td><code>facepalm</code></td><td>🤦</td></tr> + <tr><td><code>no_entry</code></td><td>⛔</td></tr> + <tr><td><code>no_entry_sign</code></td><td>🚫</td></tr> + <tr><td><code>cd</code></td><td>💿</td></tr> + <tr><td><code>computer</code></td><td>💻</td></tr> + <tr><td>...</td><td>...</td></tr> + </tbody></table> +</td> +</tr></table> + +You can set tags with the `X-Tags` header (or any of its aliases: `Tags`, `tag`, or `ta`). Specify multiple tags by separating them with a comma, e.g. `tag1,tag2,tag3`. + +``` +curl -H "X-Tags: warning,mailsrv13,daily-backup" -d "Backup of mailsrv13 failed" ntfy.sh/backups +curl -H "Tags: horse,unicorn" -d "Unicorns are just horses with unique horns" ntfy.sh/backups +curl -H ta:dog -d "Dogs are awesome" ntfy.sh/backups + +ntfy publish \ + --tags=warning,mailsrv13,daily-backup \ + backups "Backup of mailsrv13 failed" +``` + +## Markdown formatting +You can format messages using [Markdown](https://www.markdownguide.org/basic-syntax/) 🤩. That means you can use **bold text**, *italicized text*, links, images, and more. Supported Markdown features (web app only for now): + +- [Emphasis](https://www.markdownguide.org/basic-syntax/#emphasis) such as **bold** (`**bold**`), *italics* (`*italics*`) +- [Links](https://www.markdownguide.org/basic-syntax/#links) (`[some tool](https://ntfy.sh)`) +- [Images](https://www.markdownguide.org/basic-syntax/#images) (`![some image](https://bing.com/logo.png)`) +- [Code blocks](https://www.markdownguide.org/basic-syntax/#code-blocks) (` ```code blocks``` `) and [inline code](https://www.markdownguide.org/basic-syntax/#inline-code) (`` `inline code` ``) +- [Headings](https://www.markdownguide.org/basic-syntax/#headings) (`# headings`, `## headings`, etc.) +- [Lists](https://www.markdownguide.org/basic-syntax/#lists) (`- lists`, `1. lists`, etc.) +- [Blockquotes](https://www.markdownguide.org/basic-syntax/#blockquotes) (`> blockquotes`) +- [Horizontal rules](https://www.markdownguide.org/basic-syntax/#horizontal-rules) (`---`) + +By default, messages sent to ntfy are rendered as plain text. To enable Markdown, set the `X-Markdown` header (or any of its aliases: `Markdown`, or `md`) to `true` (or `1` or `yes`), or set the `Content-Type` header to `text/markdown`. +As of today, **Markdown is only supported in the web app.** Here's an example of how to enable Markdown formatting: + +``` +curl \ + -d "Look ma, **bold text**, *italics*, ..." \ + -H "Markdown: yes" \ + ntfy.sh/mytopic + +ntfy publish \ + --markdown \ + mytopic \ + "Look ma, **bold text**, *italics*, ..." +``` + +## Scheduled delivery +You can delay the delivery of messages and let ntfy send them at a later date. This can be used to send yourself reminders or even to execute commands at a later date (if your subscriber acts on messages). + +Usage is pretty straight forward. You can set the delivery time using the `X-Delay` header (or any of its aliases: `Delay`, `X-At`, `At`, `X-In` or `In`), either by specifying a Unix timestamp (e.g. `1639194738`), a duration (e.g. `30m`, `3h`, `2 days`), or a natural language time string (e.g. `10am`, `8:30pm`, `tomorrow, 3pm`, `Tuesday, 7am`, [and more](https://github.com/olebedev/when)). + +As of today, the minimum delay you can set is **10 seconds** and the maximum delay is **3 days**. This can be configured with the `message-delay-limit` option. + +For the purposes of message caching, scheduled messages are kept in the cache until 12 hours after they were delivered (or whatever the server-side cache duration is set to). For instance, if a message is scheduled +to be delivered in 3 days, it'll remain in the cache for 3 days and 12 hours. Also note that naturally, turning off server-side caching is not possible in combination with this feature. + +``` +curl -H "At: tomorrow, 10am" -d "Good morning" ntfy.sh/hello +curl -H "In: 30min" -d "It's 30 minutes later now" ntfy.sh/reminder +curl -H "Delay: 1639194738" -d "Unix timestamps are awesome" ntfy.sh/itsaunixsystem + +ntfy publish \ + --at="tomorrow, 10am" \ + hello "Good morning" +``` + +Here are a few examples (assuming today's date is **12/10/2021, 9am, Eastern Time Zone**): + +<table class="remove-md-box"><tr> +<td> + <table><thead><tr><th><code>Delay/At/In</code> header</th><th>Message will be delivered at</th><th>Explanation</th></tr></thead><tbody> + <tr><td><code>30m</code></td><td>12/10/2021, 9:<b>30</b>am</td><td>30 minutes from now</td></tr> + <tr><td><code>2 hours</code></td><td>12/10/2021, <b>11:30</b>am</td><td>2 hours from now</td></tr> + <tr><td><code>1 day</code></td><td>12/<b>11</b>/2021, 9am</td><td>24 hours from now</td></tr> + <tr><td><code>10am</code></td><td>12/10/2021, <b>10am</b></td><td>Today at 10am (same day, because it's only 9am)</td></tr> + <tr><td><code>8am</code></td><td>12/<b>11</b>/2021, <b>8am</b></td><td>Tomorrow at 8am (because it's 9am already)</td></tr> + <tr><td><code>1639152000</code></td><td>12/10/2021, 11am (EST)</td><td> Today at 11am (EST)</td></tr> + </tbody></table> +</td> +</tr></table> + +## Webhooks (publish via GET) +In addition to using PUT/POST, you can also send to topics via simple HTTP GET requests. This makes it easy to use a ntfy topic as a [webhook](https://en.wikipedia.org/wiki/Webhook), or if your client has limited HTTP support. + +To send messages via HTTP GET, simply call the `/publish` endpoint (or its aliases `/send` and `/trigger`). Without any arguments, this will send the message `triggered` to the topic. However, you can provide all arguments that are also supported as HTTP headers as URL-encoded arguments. Be sure to check the list of all supported parameters and headers for details. + +For instance, assuming your topic is `mywebhook`, you can simply call `/mywebhook/trigger` to send a message (aka trigger the webhook): + +``` +curl ntfy.sh/mywebhook/trigger + +ntfy trigger mywebhook +``` + +To add a custom message, simply append the `message=` URL parameter. And of course you can set the [message priority](#message-priority), the [message title](#message-title), and [tags](#tags-emojis) as well. +For a full list of possible parameters, check the list of [supported parameters and headers](#list-of-all-parameters). + +Here's an example with a custom message, tags and a priority: + +``` +curl "ntfy.sh/mywebhook/publish?message=Webhook+triggered&priority=high&tags=warning,skull" + +ntfy publish \ + -p 5 --tags=warning,skull \ + mywebhook "Webhook triggered" +``` + +## Message templating +Templating lets you **format a JSON message body into human-friendly message and title text** using [Go templates](https://pkg.go.dev/text/template) (see tutorials [here](https://blog.gopheracademy.com/advent-2017/using-go-templates/), [here](https://www.digitalocean.com/community/tutorials/how-to-use-templates-in-go), and [here](https://developer.hashicorp.com/nomad/tutorials/templates/go-template-syntax)). This is specifically useful when **combined with webhooks** from services such as GitHub, Grafana, or other services that emit JSON webhooks. + +Instead of using a separate bridge program to parse the webhook body into the format ntfy expects, you can include a templated message and/or a templated title which will be populated based on the fields of the webhook body (so long as the webhook body is valid JSON). + +You can enable templating by setting the `X-Template` header (or its aliases `Template` or `tpl`) to `yes` or `1`, or (more appropriately for webhooks) by setting the `?template=yes` query parameter. Then, include templates in your `message` and/or `title`, using the following stanzas (see [Go docs](https://pkg.go.dev/text/template) for detailed syntax): + +* Variables,, e.g. `{{.alert.title}}` or `An error occurred: {{.error.desc}}` +* Conditionals (if/else, e.g. `{{if eq .action "opened"}}..{{else}}..{{end}}`) +* Loops (e.g. `{{range .errors}}..{{end}}`) + +> Info: Please note that the Go templating language is quite terrible. My apologies for using it for this feature. It is the best option for Go-based programs like ntfy. Stay calm and don't harm yourself or others in despair. **You can do it. I believe in you!** + +## Publish as JSON +For some integrations with other tools, adding custom headers to HTTP requests may be tricky or impossible, so ntfy also allows publishing the entire message as JSON in the request body. + +To publish as JSON, simple PUT/POST the JSON object directly to the ntfy root URL. The message format is described below the example. + +Here's an example using most supported parameters. Check the table below for a complete list. The `topic` parameter is the only required one: + +``` +curl ntfy.sh \ + -d '{ + "topic": "mytopic", + "message": "Disk space is low at 5.1 GB", + "title": "Low disk space alert", + "tags": ["warning","cd"], + "priority": 4, + "attach": "https://filesrv.lan/space.jpg", + "filename": "diskspace.jpg", + "click": "https://homecamera.lan/xasds1h2xsSsa/", + "actions": [{ "action": "view", "label": "Admin panel", "url": "https://filesrv.lan/admin" }] + }' +``` + +The JSON message format closely mirrors the format of the message you can consume when you subscribe via the API (see JSON message format for details), but is not exactly identical. +Here's an overview of all the supported fields: + +| Field | Required | Type | Example | Description | +| ---------- | -------- | -------------------------------- | ----------------------------------------- | --------------------------------------------------------------------- | +| `topic` | ✔️ | *string* | `topic1` | Target topic name | +| `message` | - | *string* | `Some message` | Message body; set to `triggered` if empty or not passed | +| `title` | - | *string* | `Some title` | Message title(#message-title) | +| `tags` | - | *string array* | `["tag1","tag2"]` | List of [tags](#tags-emojis) that may or not map to emojis | +| `priority` | - | *int (one of: 1, 2, 3, 4, or 5)* | `4` | Message [priority](#message-priority) with 1=min, 3=default and 5=max | +| `actions` | - | *JSON array* | *(see [action buttons](#action-buttons))* | Custom [user action buttons](#action-buttons) for notifications | +| `click` | - | *URL* | `https://example.com` | Website opened when notification is [clicked](#click-action) | +| `attach` | - | *URL* | `https://example.com/file.jpg` | URL of an attachment, see [attach via URL](#attach-file-from-url) | +| `markdown` | - | *bool* | `true` | Set to true if the `message` is Markdown-formatted | +| `icon` | - | *string* | `https://example.com/icon.png` | URL to use as notification [icon](#icons) | +| `filename` | - | *string* | `file.jpg` | File name of the attachment | +| `delay` | - | *string* | `30min`, `9am` | Timestamp or duration for delayed delivery | +| `email` | - | *e-mail address* | `phil@example.com` | E-mail address for e-mail notifications | +| `call` | - | *phone number or 'yes'* | `+1222334444` or `yes` | Phone number to use for [voice call](#phone-calls) | + +## Action buttons +You can add action buttons to notifications to allow yourself to react to a notification directly. This is incredibly useful and has countless applications. + +You can control your home appliances (open/close garage door, change temperature on thermostat, ...), react to common monitoring alerts (clear logs when disk is full, ...), and many other things. The sky is the limit. + +As of today, the following actions are supported: + +* [`view`](#open-websiteapp): Opens a website or app when the action button is tapped +* [`broadcast`](#send-android-broadcast): Sends an [Android broadcast](https://developer.android.com/guide/components/broadcasts) intent when the action button is tapped (only supported on Android) +* [`http`](#send-http-request): Sends HTTP POST/GET/PUT request when the action button is tapped + +### Defining actions +You can define **up to three user actions** in your notifications, using either of the following methods: + +* In the [`X-Actions` header](#using-a-header), using a simple comma-separated format +* As a [JSON array](#using-a-json-array) in the `actions` key, when [publishing as JSON](#publish-as-json) + +#### Using a header +To define actions using the `X-Actions` header (or any of its aliases: `Actions`, `Action`), use the following format: + +Header format (long) +``` +action=<action1>, label=<label1>, paramN=... [; action=<action2>, label=<label2>, ...] +``` + +Header format (short) +``` +<action1>, <label1>, paramN=... [; <action2>, <label2>, ...] +``` + +Multiple actions are separated by a semicolon (`;`), and key/value pairs are separated by commas (`,`). Values may be quoted with double quotes (`"`) or single quotes (`'`) if the value itself contains commas or semicolons. + +The `action=` and `label=` prefix are optional in all actions, and the `url=` prefix is optional in the `view` and `http` action. The only limitation of this format is that depending on your language/library, UTF-8 characters may not work. If they don't, use the [JSON array format](#using-a-json-array) instead. + +As an example, here's how you can create the above notification using this format. Refer to the [`view` action](#open-websiteapp) and [`http` action](#send-http-request) section for details on the specific actions: + +``` +body='{"temperature": 65}' +curl \ + -d "You left the house. Turn down the A/C?" \ + -H "Actions: view, Open portal, https://home.nest.com/, clear=true; \ + http, Turn down, https://api.nest.com/, body='$body'" \ + ntfy.sh/myhome + +body='{"temperature": 65}' +ntfy publish \ + --actions="view, Open portal, https://home.nest.com/, clear=true; \ + http, Turn down, https://api.nest.com/, body='$body'" \ + myhome \ + "You left the house. Turn down the A/C?" +``` + +#### Using a JSON array +Alternatively, the same actions can be defined as **JSON array**, if the notification is defined as part of the JSON body (see publish as JSON): + +``` +curl ntfy.sh \ + -d '{ + "topic": "myhome", + "message": "You left the house. Turn down the A/C?", + "actions": [ + { + "action": "view", + "label": "Open portal", + "url": "https://home.nest.com/", + "clear": true + }, + { + "action": "http", + "label": "Turn down", + "url": "https://api.nest.com/", + "body": "{\"temperature\": 65}" + } + ] + }' + +ntfy publish \ + --actions '[ + { + "action": "view", + "label": "Open portal", + "url": "https://home.nest.com/", + "clear": true + }, + { + "action": "http", + "label": "Turn down", + "url": "https://api.nest.com/", + "body": "{\"temperature\": 65}" + } + ]' \ + myhome \ + "You left the house. Turn down the A/C?" +``` + +The required/optional fields for each action depend on the type of the action itself. Please refer to [`view` action](#open-websiteapp), [`broadcast` action](#send-android-broadcast), and [`http` action](#send-http-request) for details. + +### Open website/app +The `view` action **opens a website or app when the action button is tapped**, e.g. a browser, a Google Maps location, or even a deep link into Twitter or a show ntfy topic. How exactly the action is handled depends on how Android and your desktop browser treat the links. Normally it'll just open a link in the browser. + +Examples: + +* `http://` or `https://` will open your browser (or an app if it registered for a URL) +* `mailto:` links will open your mail app, e.g. `mailto:phil@example.com` +* `geo:` links will open Google Maps, e.g. `geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+CA` +* `ntfy://` links will open ntfy (see [ntfy:// links](subscribe/phone.md#ntfy-links)), e.g. `ntfy://ntfy.sh/stats` +* `twitter://` links will open Twitter, e.g. `twitter://user?screen_name=..` +* ... + +Here's an example using the [`X-Actions` header](#using-a-header): + +``` +curl \ + -d "Somebody retweeted your tweet." \ + -H "Actions: view, Open Twitter, https://twitter.com/binwiederhier/status/1467633927951163392" \ +ntfy.sh/myhome + +ntfy publish \ + --actions="view, Open Twitter, https://twitter.com/binwiederhier/status/1467633927951163392" \ + myhome \ + "Somebody retweeted your tweet." +``` + +And the same example using [JSON publishing](#publish-as-json): + +``` +curl ntfy.sh \ + -d '{ + "topic": "myhome", + "message": "Somebody retweeted your tweet.", + "actions": [ + { + "action": "view", + "label": "Open Twitter", + "url": "https://twitter.com/binwiederhier/status/1467633927951163392" + } + ] + }' + +ntfy publish \ + --actions '[ + { + "action": "view", + "label": "Open Twitter", + "url": "https://twitter.com/binwiederhier/status/1467633927951163392" + } + ]' \ + myhome \ + "Somebody retweeted your tweet." +``` + +The `view` action supports the following fields: + +| Field | Required | Type | Default | Example | Description | +| -------- | -------- | --------- | ------- | --------------------- | ------------------------------------------------ | +| `action` | ✔️ | *string* | - | `view` | Action type (**must be `view`**) | +| `label` | ✔️ | *string* | - | `Turn on light` | Label of the action button in the notification | +| `url` | ✔️ | *URL* | - | `https://example.com` | URL to open when action is tapped | +| `clear` | -️ | *boolean* | `false` | `true` | Clear notification after action button is tapped | + +### Send Android broadcast +The `broadcast` action **sends an [Android broadcast](https://developer.android.com/guide/components/broadcasts) intent when the action button is tapped**. This allows integration into automation apps such as [MacroDroid](https://play.google.com/store/apps/details?id=com.arlosoft.macrodroid) or [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm), which basically means you can do everything your phone is capable of. Examples include taking pictures, launching/killing apps, change device settings, write/read files, etc. + +By default, the intent action **`io.heckel.ntfy.USER_ACTION`** is broadcast, though this can be changed with the `intent` parameter (see below). +To send extras, use the `extras` parameter. Currently, **only string extras are supported**. + +Here's an example using the [`X-Actions` header](#using-a-header): + +``` +curl \ + -d "Your wife requested you send a picture of yourself." \ + -H "Actions: broadcast, Take picture, extras.cmd=pic, extras.camera=front" \ +ntfy.sh/wifey + +ntfy publish \ + --actions="broadcast, Take picture, extras.cmd=pic, extras.camera=front" \ + wifey \ + "Your wife requested you send a picture of yourself." +``` + +And the same example using [JSON publishing](#publish-as-json): + +``` +curl ntfy.sh \ + -d '{ + "topic": "wifey", + "message": "Your wife requested you send a picture of yourself.", + "actions": [ + { + "action": "broadcast", + "label": "Take picture", + "extras": { + "cmd": "pic", + "camera": "front" + } + } + ] + }' + +ntfy publish \ + --actions '[ + { + "action": "broadcast", + "label": "Take picture", + "extras": { + "cmd": "pic", + "camera": "front" + } + } + ]' \ + wifey \ + "Your wife requested you send a picture of yourself." +``` + +The `broadcast` action supports the following fields: + +| Field | Required | Type | Default | Example | Description | +| -------- | -------- | ---------------- | ---------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `action` | ✔️ | *string* | - | `broadcast` | Action type (**must be `broadcast`**) | +| `label` | ✔️ | *string* | - | `Turn on light` | Label of the action button in the notification | +| `intent` | -️ | *string* | `io.heckel.ntfy.USER_ACTION` | `com.example.AN_INTENT` | Android intent name, **default is `io.heckel.ntfy.USER_ACTION`** | +| `extras` | -️ | *map of strings* | - | *see above* | Android intent extras. Currently, only string extras are supported. When publishing as JSON, extras are passed as a map. When the simple format is used, use `extras.<param>=<value>`. | +| `clear` | -️ | *boolean* | `false` | `true` | Clear notification after action button is tapped | + +### Send HTTP request +The `http` action **sends a HTTP request when the action button is tapped**. You can use this to trigger REST APIs for whatever systems you have, e.g. opening the garage door, or turning on/off lights. + +By default, this action sends a **POST request** (not GET!), though this can be changed with the `method` parameter. The only required parameter is `url`. Headers can be passed along using the `headers` parameter. + +Here's an example using the [`X-Actions` header](#using-a-header): + +``` +curl \ + -d "Garage door has been open for 15 minutes. Close it?" \ + -H "Actions: http, Close door, https://api.mygarage.lan/, method=PUT, headers.Authorization=Bearer zAzsx1sk.., body={\"action\": \"close\"}" \ + ntfy.sh/myhome + +ntfy publish \ + --actions="http, Close door, https://api.mygarage.lan/, method=PUT, headers.Authorization=Bearer zAzsx1sk.., body={\"action\": \"close\"}" \ + myhome \ + "Garage door has been open for 15 minutes. Close it?" +``` + +And the same example using [JSON publishing](#publish-as-json): + +``` +curl ntfy.sh \ + -d '{ + "topic": "myhome", + "message": "Garage door has been open for 15 minutes. Close it?", + "actions": [ + { + "action": "http", + "label": "Close door", + "url": "https://api.mygarage.lan/", + "method": "PUT", + "headers": { + "Authorization": "Bearer zAzsx1sk.." + }, + "body": "{\"action\": \"close\"}" + } + ] + }' + +ntfy publish \ + --actions '[ + { + "action": "http", + "label": "Close door", + "url": "https://api.mygarage.lan/", + "method": "PUT", + "headers": { + "Authorization": "Bearer zAzsx1sk.." + }, + "body": "{\"action\": \"close\"}" + } + ]' \ + myhome \ + "Garage door has been open for 15 minutes. Close it?" +``` + +The `http` action supports the following fields: + +| Field | Required | Type | Default | Example | Description | +| --------- | -------- | ------------------ | -------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `action` | ✔️ | *string* | - | `http` | Action type (**must be `http`**) | +| `label` | ✔️ | *string* | - | `Open garage door` | Label of the action button in the notification | +| `url` | ✔️ | *string* | - | `https://ntfy.sh/mytopic` | URL to which the HTTP request will be sent | +| `method` | -️ | *GET/POST/PUT/...* | `POST` ⚠️ | `GET` | HTTP method to use for request, **default is POST** ⚠️ | +| `headers` | -️ | *map of strings* | - | *see above* | HTTP headers to pass in request. When publishing as JSON, headers are passed as a map. When the simple format is used, use `headers.<header1>=<value>`. | +| `body` | -️ | *string* | *empty* | `some body, somebody?` | HTTP body | +| `clear` | -️ | *boolean* | `false` | `true` | Clear notification after HTTP request succeeds. If the request fails, the notification is not cleared. | + +## Click action +You can define which URL to open when a notification is clicked. This may be useful if your notification is related to a Zabbix alert or a transaction that you'd like to provide the deep-link for. Tapping the notification will open the web browser (or the app) and open the website. + +To define a click action for the notification, pass a URL as the value of the `X-Click` header (or its alias `Click`). +If you pass a website URL (`http://` or `https://`) the web browser will open. If you pass another URI that can be handled by another app, the responsible app may open. + +Examples: + +* `http://` or `https://` will open your browser (or an app if it registered for a URL) +* `mailto:` links will open your mail app, e.g. `mailto:phil@example.com` +* `geo:` links will open Google Maps, e.g. `geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+CA` +* `ntfy://` links will open ntfy (see [ntfy:// links](subscribe/phone.md#ntfy-links)), e.g. `ntfy://ntfy.sh/stats` +* `twitter://` links will open Twitter, e.g. `twitter://user?screen_name=..` +* ... + +Here's an example that will open Reddit when the notification is clicked: + +``` +curl \ + -d "New messages on Reddit" \ + -H "Click: https://www.reddit.com/message/messages" \ + ntfy.sh/reddit_alerts + +ntfy publish \ + --click="https://www.reddit.com/message/messages" \ + reddit_alerts "New messages on Reddit" +``` + +## Attachments +You can **send images and other files to your phone** as attachments to a notification. The attachments are then downloaded onto your phone (depending on size and setting automatically), and can be used from the Downloads folder. + +There are two different ways to send attachments: + +* sending [a local file](#attach-local-file) via PUT, e.g. from `~/Flowers/flower.jpg` or `ringtone.mp3` +* or by [passing an external URL](#attach-file-from-a-url) as an attachment, e.g. `https://f-droid.org/F-Droid.apk` + +### Attach local file +To **send a file from your computer** as an attachment, you can send it as the PUT request body. If a message is greater than the maximum message size (4,096 bytes) or consists of non UTF-8 characters, the ntfy server will automatically +detect the mime type and size, and send the message as an attachment file. To send smaller text-only messages or files as attachments, you must pass a filename by passing the `X-Filename` header or query parameter (or any of its aliases `Filename`, `File` or `f`). + +By default, and how ntfy.sh is configured, the **max attachment size is 15 MB** (with 100 MB total per visitor). +Attachments **expire after 3 hours**, which typically is plenty of time for the user to download it, or for the Android app to auto-download it. Please also check out the [other limits below](#limitations). + +Here's an example showing how to upload an image: + +``` +curl \ + -T flower.jpg \ + -H "Filename: flower.jpg" \ + ntfy.sh/flowers + +ntfy publish \ + --file=flower.jpg \ + flowers +``` + +### Attach file from a URL +Instead of sending a local file to your phone, you can use **an external URL** to specify where the attachment is hosted. +This could be a Dropbox link, a file from social media, or any other publicly available URL. Since the files are externally hosted, the expiration or size limits from above do not apply here. + +To attach an external file, simple pass the `X-Attach` header or query parameter (or any of its aliases `Attach` or `a`) to specify the attachment URL. It can be any type of file. + +ntfy will automatically try to derive the file name from the URL (e.g `https://example.com/flower.jpg` will yield a filename `flower.jpg`). To override this filename, you may send the `X-Filename` header or query parameter (or any of its aliases `Filename`, `File` or `f`). + +Here's an example showing how to attach an APK file: + +``` +curl \ + -X POST \ + -H "Attach: https://f-droid.org/F-Droid.apk" \ + ntfy.sh/mydownloads + +ntfy publish \ + --attach="https://f-droid.org/F-Droid.apk" \ + mydownloads +``` + +## Icons +You can include an icon that will appear next to the text of the notification. Simply pass the `X-Icon` header or query parameter (or its alias `Icon`) to specify the URL that the icon is located at. The client will automatically download the icon (unless it is already cached locally, and less than 24 hours old), and show it in the notification. Icons are cached locally in the client until the notification is deleted. **Only JPEG and PNG images are supported at this time**. + +Here's an example showing how to include an icon: + +``` +curl \ + -H "Icon: https://styles.redditmedia.com/t5_32uhe/styles/communityIcon_xnt6chtnr2j21.png" \ + -H "Title: Kodi: Resuming Playback" \ + -H "Tags: arrow_forward" \ + -d "The Wire, S01E01" \ + ntfy.sh/tvshows + +ntfy publish \ + --icon="https://styles.redditmedia.com/t5_32uhe/styles/communityIcon_xnt6chtnr2j21.png" \ + --title="Kodi: Resuming Playback" \ + --tags="arrow_forward" \ + tvshows \ + "The Wire, S01E01" +``` + +## Compose + +```yml +services: + ntfy: + image: binwiederhier/ntfy + container_name: ntfy + command: + - serve + environment: + - TZ=UTC # optional: set desired timezone + user: UID:GID # optional: replace with your own user/group or uid/gid + volumes: + - /var/cache/ntfy:/var/cache/ntfy + - /etc/ntfy:/etc/ntfy + ports: + - 80:80 + healthcheck: # optional: remember to adapt the host:port to your environment + test: ["CMD-SHELL", "wget -q --tries=1 http://localhost:80/v1/health -O - | grep -Eo '\"healthy\"\\s*:\\s*true' || exit 1"] + interval: 60s + timeout: 10s + retries: 3 + start_period: 40s + restart: unless-stopped +``` From 478e1d55558601e17925e31d87074eb05ae70c1a Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Fri, 20 Jun 2025 02:14:30 +0200 Subject: [PATCH 85/99] add fish --- technology/applications/cli/fish.md | 278 ++++++++++++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100644 technology/applications/cli/fish.md diff --git a/technology/applications/cli/fish.md b/technology/applications/cli/fish.md new file mode 100644 index 0000000..1202d9b --- /dev/null +++ b/technology/applications/cli/fish.md @@ -0,0 +1,278 @@ +--- +obj: application +website: https://fishshell.com +repo: https://github.com/fish-shell/fish-shell +--- + +# fish +fish is a smart and user-friendly command line shell for Linux, macOS, and the rest of the family. + +## Usage +### Abbreviations +To avoid needless typing, a frequently-run command like `git checkout` can be abbreviated to `gco` using the `abbr` command. + +``` +abbr -a gco git checkout +``` + +After entering `gco` and pressing space or enter, a `gco` in command position will turn into `git checkout` in the command line. If you want to use a literal `gco` sometimes, use `ctrl-space`. + +Abbreviations are a lot more powerful than just replacing literal strings. For example you can make going up a number of directories easier with this: + +```fish +function multicd + echo cd (string repeat -n (math (string length -- $argv[1]) - 1) ../) +end +abbr --add dotdot --regex '^\.\.+$' --function multicd +``` + +Now, `..` transforms to `cd ../`, while `...` turns into `cd ../../` and `....` expands to `cd ../../../`. + +The advantage over aliases is that you can see the actual command before using it, add to it or change it, and the actual command will be stored in history. + +### Custom bindings +In addition to the standard bindings listed here, you can also define your own with `bind`: + +``` +# Just clear the commandline on control-c +bind ctrl-c 'commandline -r ""' +``` + +Put `bind` statements into `config.fish` or a function called `fish_user_key_bindings`. + +If you change your mind on a binding and want to go back to fish’s default, you can simply erase it again: + +``` +bind --erase ctrl-c +``` + +### History +After a command has been executed, it is remembered in the history list. Any duplicate history items are automatically removed. By pressing the up and down keys, you can search forwards and backwards in the history. If the current command line is not empty when starting a history search, only the commands containing the string entered into the command line are shown. + +By pressing `alt-up` (`↑`) and `alt-down` (`↓`), a history search is also performed, but instead of searching for a complete commandline, each commandline is broken into separate elements just like it would be before execution, and the history is searched for an element matching that under the cursor. + +For more complicated searches, you can press `ctrl-r` to open a pager that allows you to search the history. It shows a limited number of entries in one page, press `ctrl-r` again to move to the next page and `ctrl-s` to move to the previous page. You can change the text to refine your search. + +History searches are case-insensitive unless the search string contains an uppercase character. You can stop a search to edit your search string by pressing `escape` or `pagedown`. + +Prefixing the commandline with a space will prevent the entire line from being stored in the history. It will still be available for recall until the next command is executed, but will not be stored on disk. This is to allow you to fix misspellings and such. + +The command history is stored in the file `~/.local/share/fish/fish_history` (or `$XDG_DATA_HOME/fish/fish_history` if that variable is set) by default. However, you can set the `fish_history` environment variable to change the name of the history session (resulting in a `<session>_history` file); both before starting the shell and while the shell is running. + +See the `history` command for other manipulations. + +#### Private mode +Fish has a private mode, in which command history will not be written to the history file on disk. To enable it, either set `$fish_private_mode` to a non-empty value, or launch with `fish --private` (or `fish -P` for short). + +If you launch fish with `-P`, it both hides old history and prevents writing history to disk. This is useful to avoid leaking personal information (e.g. for screencasts) or when dealing with sensitive information. + +You can query the variable `fish_private_mode (if test -n "$fish_private_mode" ...)` if you would like to respect the user’s wish for privacy and alter the behavior of your own fish scripts. + +### Directory History +Navigating directories is usually done with the `cd` command, but fish offers some advanced features as well. + +The current working directory can be displayed with the `pwd` command, or the `$PWD` special variable. Usually your prompt already does this. + +Fish automatically keeps a trail of the recent visited directories with `cd` by storing this history in the `dirprev` and `dirnext` variables. + +Several commands are provided to interact with this directory history: + +- `dirh` prints the history +- `cdh` displays a prompt to quickly navigate the history +- `prevd` moves backward through the history. It is bound to `alt-left` (`←`) +- `nextd` moves forward through the history. It is bound to `alt-right` (`→`) + +## Configuration +To store configuration write it to a file called `~/.config/fish/config.fish`. + +`.fish` scripts in `~/.config/fish/conf.d/` are also automatically executed before `config.fish`. + +These files are read on the startup of every shell, whether interactive and/or if they’re login shells. Use `status --is-interactive` and `status --is-login` to do things only in interactive/login shells, respectively. + +## Shell Scripting +### Shebang +Because shell scripts are written in many different languages, they need to carry information about which interpreter should be used to execute them. For this, they are expected to have a first line, the shebang line, which names the interpreter executable. + +A script written in **bash** would need a first line like this: + +``` +#!/bin/bash +``` + +When the shell tells the kernel to execute the file, it will use the interpreter `/bin/bash`. + +For a script written in another language, just replace `/bin/bash` with the interpreter for that language. For example: `/usr/bin/python` for a python script, or `/usr/local/bin/fish` for a fish script, if that is where you have them installed. + +If you want to share your script with others, you might want to use **env** to allow for the interpreter to be installed in other locations. For example: + +``` +#!/usr/bin/env fish +echo Hello from fish $version +``` + +This will call `env`, which then goes through [`PATH`](https://fishshell.com/docs/current/language.html#envvar-PATH) to find a program called “fish”. This makes it work, whether fish is installed in (for example) `/usr/local/bin/fish`, `/usr/bin/fish`, or `~/.local/bin/fish`, as long as that directory is in [`PATH`](https://fishshell.com/docs/current/language.html#envvar-PATH). + +The shebang line is only used when scripts are executed without specifying the interpreter. For functions inside fish or when executing a script with `fish /path/to/script`, a shebang is not required (but it doesn’t hurt!). + +When executing files without an interpreter, fish, like other shells, tries your system shell, typically `/bin/sh`. This is needed because some scripts are shipped without a shebang line. + +### Variables +In Fish, variables are assigned using the `set` command: + +```fish +set name "Alice" +set -g global_var "I'm global" +set -x PATH $PATH /custom/bin # export variable to child processes +``` + +* `-g`: Sets a global variable. +* `-x`: Exports the variable. +* Arrays are space-separated: + +```fish +set colors red green blue +echo $colors[1] # Outputs: red +``` + +### Conditionals + +Fish uses `if`, `else if`, and `else`: + +```fish +set age 20 + +if test $age -ge 18 + echo "You're an adult" +else if test $age -ge 13 + echo "You're a teenager" +else + echo "You're a child" +end +``` + +#### Switch Statements + +Use `switch` for cleaner branching with string values: + +```fish +set lang "rust" + +switch $lang + case rust + echo "You're using Rust!" + case python + echo "Python is cool too." + case '*' + echo "Unknown language" +end +``` + +### Loops + +#### `for` Loop + +```fish +for color in red green blue + echo $color +end +``` + +#### `while` Loop + +```fish +set count 1 +while test $count -le 3 + echo "Count: $count" + set count (math $count + 1) +end +``` + +### Functions + +Define reusable blocks of code with `function`: + +```fish +function greet + echo "Hello, $argv" +end + +greet "World" # Output: Hello, World +``` + +* `$argv` holds all passed arguments. +* `$argv[1]` is the first argument. + +#### Returning Values + +Functions can return more than just a status code. They can return actual output: + +```fish +function get_username + echo "alice" +end + +set user (get_username) +echo $user # Outputs: alice +``` + +For status codes, use `return`: + +```fish +function is_even + if test (math "$argv[1] % 2") -eq 0 + return 0 + else + return 1 + end +end +``` + +#### Events + +Fish supports event-driven scripting using `functions --on-event`: + +```fish +function notify_start --on-event fish_prompt + echo "Shell is ready!" +end +``` + +Events can be fired with the `emit` command, and do not have to be defined before. The names just need to match. For example: + +```fish +function handler --on-event imdone + echo generator is done $argv +end + +function generator + sleep 1 + # The "imdone" is the name of the event + # the rest is the arguments to pass to the handler + emit imdone with $argv +end +``` + +### Tools +Builtins to do a task, like + +- `cd` to change the current directory. +- `echo` or `printf` to produce output. +- `set_color` to colorize output. +- `set` to set, query or erase variables. +- `read` to read input. +- `string` for string manipulation. +- `path` for filtering paths and handling their components. +- `math` does arithmetic. +- `argparse` to make arguments easier to handle. +- `count` to count arguments. +- `type` to find out what sort of thing (command, builtin or function) fish would call, or if it exists at all. +- `test` checks conditions like if a file exists or a string is empty. +- `contains` to see if a list contains an entry. +- `eval` and `source` to run fish code from a string or file. +- `status` to get shell information, like whether it’s interactive or a login shell, or which file it is currently running. +- `abbr` manages Abbreviations. +- `bind` to change bindings. +- `complete` manages completions. +- `commandline` to get or change the commandline contents. +- `fish_config` to easily change fish’s configuration, like the prompt or colorscheme. +- `random` to generate random numbers or pick from a list. From c89e8a287cccadc716404d32e10ef3fadb523846 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Fri, 20 Jun 2025 02:15:50 +0200 Subject: [PATCH 86/99] update monero --- technology/tools/Monero.md | 123 ++++++++++++++++++++++++++++++++----- 1 file changed, 108 insertions(+), 15 deletions(-) diff --git a/technology/tools/Monero.md b/technology/tools/Monero.md index 9837f61..accfb02 100644 --- a/technology/tools/Monero.md +++ b/technology/tools/Monero.md @@ -1,5 +1,6 @@ --- -website: https://www.getmonero.org/ +website: https://www.getmonero.org +repo: https://github.com/monero-project/monero obj: concept --- @@ -18,19 +19,111 @@ RingCT further improves privacy by concealing transaction amounts. This is achie ### 5. **Dynamic Block Size and Fees** Monero dynamically adjusts block size and fees based on network demand, ensuring scalability and preventing congestion. -## How Monero Works -Monero's privacy features are implemented through a combination of cryptographic techniques. When a user initiates a transaction, the following process occurs: -1. **Ring Signature Generation:** - - The sender's public key is combined with several other public keys from the blockchain to create a ring signature. - - This signature authenticates the transaction without revealing the actual sender. -2. **Stealth Address Generation:** - - The recipient's public address is masked by a one-time stealth address created for the specific transaction. - - This ensures that the recipient's identity remains private. -3. **RingCT Implementation:** - - RingCT obscures the transaction amount, providing an additional layer of privacy. - - It allows for the verification of transaction validity without disclosing specific amounts. -4. **Dynamic Block Size and Fees:** - - Monero adjusts block size and fees dynamically, allowing for scalability and preventing congestion. +## Daemon +`monerod` connects to the Monero Network and acts as a node. + +### Configuration +By default Monero looks for `bitmonero.conf` in Monero data directory. + +To use a specific config file add `--config-file` option: `./monerod --config-file=/etc/monerod.conf` + +``` +# ~/.bitmonero/bitmonero.conf +# +# Configuration file for monerod. For all available options see the MoneroDocs: +# https://docs.getmonero.org/interacting/monerod-reference/ + +# Data directory (blockchain db and indices) +data-dir=~/.bitmonero # Blockchain storage location + +# Optional pruning +#prune-blockchain=1 # Pruning saves 2/3 of disk space w/o degrading functionality but contributes less to the network +#sync-pruned-blocks=1 # Allow downloading pruned blocks instead of prunning them yourself + +# Centralized services +check-updates=disabled # Do not check DNS TXT records for a new version +enable-dns-blocklist=1 # Block known malicious nodes + +# Banlist +#ban-list=/path/to/ban.txt # Local list of peers to ban + +# Log file +log-file=~/.bitmonero +log-level=0 # Minimal logs, WILL NOT log peers or wallets connecting + + +# P2P full node +#p2p-bind-ip=0.0.0.0 # Bind to all interfaces (the default) +#p2p-bind-port=18080 # Bind to default port +#no-igd=1 # Disable UPnP port mapping + +# RPC open node +#public-node=1 # Advertise to other users they can use this node for connecting their wallets +rpc-restricted-bind-ip=0.0.0.0 # Bind to all interfaces (the Open Node) +rpc-restricted-bind-port=18089 # Bind to a new RESTRICTED port (the Open Node) + +# RPC TLS +rpc-ssl=autodetect # Use TLS if client wallet supports it; [enabled|disabled|(default)autodetect] + +# ZMQ +#zmq-rpc-bind-ip=127.0.0.1 # Default 127.0.0.1 +#zmq-rpc-bind-port=18082 # Default 18082 +zmq-pub=tcp://127.0.0.1:18083 # ZMQ pub +#no-zmq=1 # Disable ZMQ RPC server + +# Mempool size +max-txpool-weight=2684354560 # Maximum unconfirmed transactions pool size in bytes (here ~2.5GB, default ~618MB) + +# Database sync mode +#db-sync-mode=safe:sync # Slow but reliable db writes + +# Network limits +out-peers=12 # Default 12 +in-peers=48 # The default is unlimited; we prefer to put a cap on this + +limit-rate-up=1048576 # 1048576 kB/s == 1GB/s; a raise from default 2048 kB/s; contribute more to p2p network +limit-rate-down=1048576 # 1048576 kB/s == 1GB/s; a raise from default 8192 kB/s; allow for faster initial sync + +# Tor/I2P: broadcast transactions originating from connected wallets over Tor/I2P (does not concern relayed transactions) +#tx-proxy=i2p,127.0.0.1:4447,12,disable_noise # I2P +#tx-proxy=tor,127.0.0.1:9050,12,disable_noise # Tor + +# Tor/I2P: tell monerod your onion address so it can be advertised on P2P network +#anonymous-inbound=PASTE_YOUR_I2P_HOSTNAME,127.0.0.1:18085,24 # I2P +#anonymous-inbound=PASTE_YOUR_ONION_HOSTNAME:18084,127.0.0.1:18084,24 # Tor + +# Tor: be forgiving to connecting wallets +disable-rpc-ban=1 +``` + +### i2p +Monero should be used via [i2p](../internet/I2P.md) in order to combat networking attacks. + +First setup two b32 addresses: + +```ini +[monero-node] +type = server +host = 127.0.0.1 +# Anonymous inbound port +port = 18085 +inport = 0 +keys = monero-mainnet.dat + +[monero-rpc] +type = server +host = 127.0.0.1 +# Restricted RPC port +port = 18089 +keys = monero-mainnet.dat +``` + +Then set these in the config: + +``` +anonymous-inbound=yourlongb32i2paddress.b32.i2p,127.0.0.1:18085 +tx-proxy=i2p,127.0.0.1:4447,disable_noise +``` ## monero-cli-wallet `monero-wallet-cli` is the wallet software shipped in the Monero archives. It is a console program, and manages an account. @@ -43,7 +136,7 @@ monero-wallet-cli --generate-new-wallet <file> Use existing wallet: ```shell monero-wallet-cli --wallet-file <file> --password-file <passwd> -```` +``` ### Commands | Command | Description | From cca25658e204d84cde6d8dc0f3c421c7f3a9140a Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Sat, 21 Jun 2025 00:36:06 +0200 Subject: [PATCH 87/99] add restic --- technology/applications/backup/restic.md | 607 +++++++++++++++++++++++ 1 file changed, 607 insertions(+) create mode 100644 technology/applications/backup/restic.md diff --git a/technology/applications/backup/restic.md b/technology/applications/backup/restic.md new file mode 100644 index 0000000..929bcd5 --- /dev/null +++ b/technology/applications/backup/restic.md @@ -0,0 +1,607 @@ +--- +obj: application +website: https://restic.net +repo: https://github.com/restic/restic +--- + +# restic +restic is a backup program which allows saving multiple revisions of files and directories in an encrypted repository stored on different backends. + +## Usage +Usage: `restic [command] [options]` + +### Global Options + +| Option | Environment | Description | +| ---------------------------------- | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| `--cacert` file | `$RESTIC_CACERT` | file to load root certificates from (default: use system certificates or `$RESTIC_CACERT`) | +| `--cache-dir` directory | | set the cache directory. (default: use system default cache directory) | +| `--cleanup-cache` | | auto remove old cache directories | +| `--compression` mode | `$RESTIC_COMPRESSION` | compression mode (only available for repository format version 2), one of (auto/off/max) (default: `$RESTIC_COMPRESSION`) (default auto) | +| `-h`, `--help` | | help for restic | +| `--http-user-agent` string | | set a http user agent for outgoing http requests | +| `--insecure-no-password` | | use an empty password for the repository, must be passed to every restic command (insecure) | +| `--insecure-tls` | | skip TLS certificate verification when connecting to the repository (insecure) | +| `--json` | | set output mode to JSON for commands that support it | +| `--key-hint` key | `$RESTIC_KEY_HINT` | key ID of key to try decrypting first (default: `$RESTIC_KEY_HINT`) | +| `--limit-download` rate | | limits downloads to a maximum rate in KiB/s. (default: unlimited) | +| `--limit-upload` rate | | limits uploads to a maximum rate in KiB/s. (default: unlimited) | +| `--no-cache` | | do not use a local cache | +| `--no-extra-verify` | | skip additional verification of data before upload (see documentation) | +| `--no-lock` | | do not lock the repository, this allows some operations on read-only repositories | +| `-o`, `--option` key=value | | set extended option (key=value, can be specified multiple times) | +| `--pack-size` size | `$RESTIC_PACK_SIZE` | set target pack size in MiB, created pack files may be larger (default: `$RESTIC_PACK_SIZE`) | +| `--password-command` command | `$RESTIC_PASSWORD_COMMAND` | shell command to obtain the repository password from (default: `$RESTIC_PASSWORD_COMMAND`) | +| `-p`, `--password-file` file | `$RESTIC_PASSWORD_FILE` | file to read the repository password from (default: `$RESTIC_PASSWORD_FILE`) | +| `-q`, `--quiet` | | do not output comprehensive progress report | +| `-r`, `--repo` repository | `$RESTIC_REPOSITORY` | repository to backup to or restore from (default: `$RESTIC_REPOSITORY`) | +| `--repository-file` file | `$RESTIC_REPOSITORY_FILE` | file to read the repository location from (default: `$RESTIC_REPOSITORY_FILE`) | +| `--retry-lock` duration | | retry to lock the repository if it is already locked, takes a value like 5m or 2h (default: no retries) | +| `--stuck-request-timeout` duration | | duration after which to retry stuck requests (default 5m0s) | +| `--tls-client-cert` file | `$RESTIC_TLS_CLIENT_CERT` | path to a file containing PEM encoded TLS client certificate and private key (default: `$RESTIC_TLS_CLIENT_CERT`) | +| `-v`, `--verbose` | | be verbose (specify multiple times or a level using --verbose=n, max level/times is 2) | + + +### backup + +The "backup" command creates a new snapshot and saves the files and directories given as the arguments. + +Exit Codes: +- Exit status is 0 if the command was successful. +- Exit status is 1 if there was a fatal error (no snapshot created). +- Exit status is 3 if some source data could not be read (incomplete snapshot created). +- Exit status is 10 if the repository does not exist. +- Exit status is 11 if the repository is already locked. +- Exit status is 12 if the password is incorrect. + +Usage: `restic backup [flags] [FILE/DIR] ...` + +| Option | Environment | Description | +| ---------------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-n`, `--dry-run` | | do not upload or write any data, just show what would be done | +| `-e`, `--exclude pattern` | | exclude a pattern (can be specified multiple times) | +| `--exclude-caches` | | excludes cache directories that are marked with a CACHEDIR.TAG file. See https://bford.info/cachedir/ for the Cache Directory Tagging Standard | +| `--exclude-file file` | | read exclude patterns from a file (can be specified multiple times) | +| `--exclude-if-present filename[:header]` | | takes `filename[:header]`, exclude contents of directories containing filename (except filename itself) if header of that file is as provided (can be specified multiple times) | +| `--exclude-larger-than size` | | max size of the files to be backed up (allowed suffixes: k/K, m/M, g/G, t/T) | +| `--files-from file` | | read the files to backup from file (can be combined with file args; can be specified multiple times) | +| `--files-from-raw file` | | read the files to backup from file (can be combined with file args; can be specified multiple times) | +| `--files-from-verbatim file` | | read the files to backup from file (can be combined with file args; can be specified multiple times) | +| `-f`, `--force` | | force re-reading the source files/directories (overrides the "parent" flag) | +| `-g`, `--group-by group` | | group snapshots by host, paths and/or tags, separated by comma (disable grouping with '') (default host,paths) | +| `-H`, `--host hostname` | `$RESTIC_HOST` | set the hostname for the snapshot manually. To prevent an expensive rescan use the "parent" flag | +| `--iexclude pattern` | | same as --exclude pattern but ignores the casing of filenames | +| `--iexclude-file file` | | same as --exclude-file but ignores casing of filenames in patterns | +| `--ignore-ctime` | | ignore ctime changes when checking for modified files | +| `--ignore-inode` | | ignore inode number and ctime changes when checking for modified files | +| `--no-scan` | | do not run scanner to estimate size of backup | +| `-x`, `--one-file-system` | | exclude other file systems, don't cross filesystem boundaries and subvolumes | +| `--parent snapshot` | | use this parent snapshot (default: latest snapshot in the group determined by --group-by and not newer than the timestamp determined by --time) | +| `--read-concurrency n` | `$RESTIC_READ_CONCURRENCY` | read n files concurrently (default: `$RESTIC_READ_CONCURRENCY` or 2) | +| `--skip-if-unchanged` | | skip snapshot creation if identical to parent snapshot | +| `--stdin` | | read backup from stdin | +| `--stdin-filename filename` | | filename to use when reading from stdin (default "stdin") | +| `--stdin-from-command` | | interpret arguments as command to execute and store its stdout | +| `--tag tags` | | add tags for the new snapshot in the format `tag[,tag,...]` (can be specified multiple times) (default []) | +| `--time time` | | time of the backup (ex. '2012-11-01 22:08:41') (default: now) | +| `--with-atime` | | store the atime for all files and directories | + +### cache + +The "cache" command allows listing and cleaning local cache directories. + +Exit Codes: +- Exit status is 0 if the command was successful. +- Exit status is 1 if there was any error. + +Usage: `restic cache [flags]` + +| Option | Environment | Description | +| ---------------- | ----------- | ----------------------------------------------------------------------- | +| `--cleanup` | | remove old cache directories | +| `--max-age days` | | max age in days for cache directories to be considered old (default 30) | +| `--no-size` | | do not output the size of the cache directories | + +### cat + +The "cat" command is used to print internal objects to stdout. + +Exit Codes: +- Exit status is 0 if the command was successful. +- Exit status is 1 if there was any error. +- Exit status is 10 if the repository does not exist. +- Exit status is 11 if the repository is already locked. +- Exit status is 12 if the password is incorrect. + +Usage: `restic cat [flags] [masterkey|config|pack ID|blob ID|snapshot ID|index ID|key ID|lock ID|tree snapshot:subfolder]` + +### check + +The "check" command tests the repository for errors and reports any errors it finds. It can also be used to read all data and therefore simulate a restore. + +By default, the "check" command will always load all data directly from the repository and not use a local cache. + +Exit Codes: +- Exit status is 0 if the command was successful. +- Exit status is 1 if there was any error. +- Exit status is 10 if the repository does not exist. +- Exit status is 11 if the repository is already locked. +- Exit status is 12 if the password is incorrect. + +Usage: `restic check [flags]` + +| Option | Description | +| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--read-data` | read all data blobs | +| `--read-data-subset subset` | read a subset of data packs, specified as 'n/t' for specific part, or either 'x%' or 'x.y%' or a size in bytes with suffixes k/K, m/M, g/G, t/T for a random subset | +| `--with-cache` | use existing cache, only read uncached data from repository | + + +### copy + +The "copy" command copies one or more snapshots from one repository to another. + +> **NOTE**: This process will have to both download (read) and upload (write) the entire snapshot(s) due to the different encryption keys used in the source and destination repositories. This *may incur higher bandwidth usage and costs* than expected during normal backup runs. + +> **NOTE**: The copying process does not re-chunk files, which may break deduplication between the files copied and files already stored in the destination repository. This means that copied files, which existed in both the source and destination repository, *may occupy up to twice their space* in the destination repository. This can be mitigated by the `--copy-chunker-params` option when initializing a new destination repository using the "init" command. + +Exit Codes: +- Exit status is 0 if the command was successful. +- Exit status is 1 if there was any error. +- Exit status is 10 if the repository does not exist. +- Exit status is 11 if the repository is already locked. +- Exit status is 12 if the password is incorrect. + +Usage: `restic copy [flags] [snapshotID ...]` + +| Option | Environment | Description | +| --------------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `--from-insecure-no-password` | | use an empty password for the source repository (insecure) | +| `--from-key-hint string` | `$RESTIC_FROM_KEY_HINT` | key ID of key to try decrypting the source repository first (default: $RESTIC_FROM_KEY_HINT) | +| `--from-password-command command` | `$RESTIC_FROM_PASSWORD_COMMAND` | shell command to obtain the source repository password from (default: $RESTIC_FROM_PASSWORD_COMMAND) | +| `--from-password-file file` | `$RESTIC_FROM_PASSWORD_FILE` | file to read the source repository password from (default: $RESTIC_FROM_PASSWORD_FILE) | +| `--from-repo repository` | `$RESTIC_FROM_REPOSITORY` | source repository to copy snapshots from (default: $RESTIC_FROM_REPOSITORY) | +| `--from-repository-file file` | `$RESTIC_FROM_REPOSITORY_FILE` | file from which to read the source repository location to copy snapshots from (default: $RESTIC_FROM_REPOSITORY_FILE) | +| `-H`, `--host host` | `$RESTIC_HOST` | only consider snapshots for this host (can be specified multiple times) (default: $RESTIC_HOST) | +| `--path path` | | only consider snapshots including this (absolute) path (can be specified multiple times, snapshots must include all specified paths) | +| `--tag tag[,tag,...]` | | only consider snapshots including `tag[,tag,...]` (can be specified multiple times) (default []) | + + +### diff + +The "diff" command shows differences from the first to the second snapshot. The first characters in each line display what has happened to a particular file or directory: + +* `+` The item was added +* `-` The item was removed +* `U` The metadata (access mode, timestamps, ...) for the item was updated +* `M` The file's content was modified +* `T` The type was changed, e.g. a file was made a symlink +* `?` Bitrot detected: The file's content has changed but all metadata is the same + +Metadata comparison will likely not work if a backup was created using the `--ignore-inode` or `--ignore-ctime` option. + +To only compare files in specific subfolders, you can use the `snapshotID:subfolder` syntax, where `subfolder` is a path within the snapshot. + +Exit Codes: +- Exit status is 0 if the command was successful. +- Exit status is 1 if there was any error. +- Exit status is 10 if the repository does not exist. +- Exit status is 11 if the repository is already locked. +- Exit status is 12 if the password is incorrect. + +Usage: `restic diff [--metadata] snapshotID snapshotID` + +### dump + +The "dump" command extracts files from a snapshot from the repository. If a single file is selected, it prints its contents to stdout. Folders are output as a tar (default) or zip file containing the contents of the specified folder. +Pass "/" as file name to dump the whole snapshot as an archive file. + +The special snapshotID "latest" can be used to use the latest snapshot in the repository. + +To include the folder content at the root of the archive, you can use the `snapshotID:subfolder` syntax, where `subfolder` is a path within the snapshot. + +Exit Codes: +- Exit status is 0 if the command was successful. +- Exit status is 1 if there was any error. +- Exit status is 10 if the repository does not exist. +- Exit status is 11 if the repository is already locked. +- Exit status is 12 if the password is incorrect. + +Usage: `restic dump [flags] snapshotID file` + +| Option | Environment | Description | +| ------------------------ | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `-a`, `--archive format` | | set archive format as "tar" or "zip" (default "tar") | +| `-H`, `--host host` | `$RESTIC_HOST` | only consider snapshots for this host, when snapshot ID "latest" is given (can be specified multiple times) (default: $RESTIC_HOST) | +| `--path path` | | only consider snapshots including this (absolute) path, when snapshot ID "latest" is given (can be specified multiple times, snapshots must include all specified paths) | +| `--tag tag[,tag,...]` | | only consider snapshots including `tag[,tag,...]`, when snapshot ID "latest" is given (can be specified multiple times) (default []) | +| `-t`, `--target path` | | write the output to target path | + +### find + +The "find" command searches for files or directories in snapshots stored in the repo. +It can also be used to search for restic blobs or trees for troubleshooting. +The default sort option for the snapshots is youngest to oldest. To sort the output from oldest to youngest specify `--reverse`. + +Usage: `restic find [flags] PATTERN...` + +Examples: +``` +restic find config.json +restic find --json "*.yml" "*.json" +restic find --json --blob 420f620f b46ebe8a ddd38656 +restic find --show-pack-id --blob 420f620f +restic find --tree 577c2bc9 f81f2e22 a62827a9 +restic find --pack 025c1d06 +``` + +Exit Codes: +- Exit status is 0 if the command was successful. +- Exit status is 1 if there was any error. +- Exit status is 10 if the repository does not exist. +- Exit status is 11 if the repository is already locked. +- Exit status is 12 if the password is incorrect. + +| Option | Environment | Description | +| ----------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `--blob` | | pattern is a blob-ID | +| `-H`, `--host host` | `$RESTIC_HOST` | only consider snapshots for this host (can be specified multiple times) (default: $RESTIC_HOST) | +| `--human-readable` | | print sizes in human readable format | +| `-i`, `--ignore-case` | | ignore case for pattern | +| `-l`, `--long` | | use a long listing format showing size and mode | +| `-N`, `--newest string` | | newest modification date/time | +| `-O`, `--oldest string` | | oldest modification date/time | +| `--pack` | | pattern is a pack-ID | +| `--path path` | | only consider snapshots including this (absolute) path (can be specified multiple times, snapshots must include all specified paths) | +| `-R`, `--reverse` | | reverse sort order oldest to newest | +| `--show-pack-id` | | display the pack-ID the blobs belong to (with --blob or --tree) | +| `-s`, `--snapshot id` | | snapshot id to search in (can be given multiple times) | +| `--tag tag[,tag,...]` | | only consider snapshots including `tag[,tag,...]` (can be specified multiple times) (default []) | +| `--tree` | | pattern is a tree-ID | + +### forget + +The "forget" command removes snapshots according to a policy. All snapshots are first divided into groups according to `--group-by`, and after that the policy specified by the `--keep-*` options is applied to each group individually. +If there are not enough snapshots to keep one for each duration related `--keep-{within-,}*` option, the oldest snapshot in the group is kept additionally. + +Please note that this command really only deletes the snapshot object in the repository, which is a reference to data stored there. In order to remove the unreferenced data after "forget" was run successfully, see the "prune" command. + +Please also read the documentation for "forget" to learn about some important security considerations. + +Exit Codes: +- Exit status is 0 if the command was successful. +- Exit status is 1 if there was any error. +- Exit status is 10 if the repository does not exist. +- Exit status is 11 if the repository is already locked. +- Exit status is 12 if the password is incorrect. + +Usage: `restic forget [flags] [snapshot ID] [...]` + +| Option | Environment | Description | +| ----------------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `-l`, `--keep-last n` | | keep the last n snapshots (use 'unlimited' to keep all snapshots) | +| `-H`, `--keep-hourly n` | | keep the last n hourly snapshots (use 'unlimited' to keep all hourly snapshots) | +| `-d`, `--keep-daily n` | | keep the last n daily snapshots (use 'unlimited' to keep all daily snapshots) | +| `-w`, `--keep-weekly n` | | keep the last n weekly snapshots (use 'unlimited' to keep all weekly snapshots) | +| `-m`, `--keep-monthly n` | | keep the last n monthly snapshots (use 'unlimited' to keep all monthly snapshots) | +| `-y`, `--keep-yearly n` | | keep the last n yearly snapshots (use 'unlimited' to keep all yearly snapshots) | +| `--keep-within duration` | | keep snapshots that are newer than duration (e.g., 1y5m7d2h) relative to the latest snapshot | +| `--keep-within-hourly duration` | | keep hourly snapshots newer than duration (e.g., 1y5m7d2h) relative to the latest snapshot | +| `--keep-within-daily duration` | | keep daily snapshots newer than duration (e.g., 1y5m7d2h) relative to the latest snapshot | +| `--keep-within-weekly duration` | | keep weekly snapshots newer than duration (e.g., 1y5m7d2h) relative to the latest snapshot | +| `--keep-within-monthly duration` | | keep monthly snapshots newer than duration (e.g., 1y5m7d2h) relative to the latest snapshot | +| `--keep-within-yearly duration` | | keep yearly snapshots newer than duration (e.g., 1y5m7d2h) relative to the latest snapshot | +| `--keep-tag taglist` | | keep snapshots with this taglist (can be specified multiple times) (default []) | +| `--unsafe-allow-remove-all` | | allow deleting all snapshots of a snapshot group | +| `--host host` | `$RESTIC_HOST` | only consider snapshots for this host (can be specified multiple times) (default: $RESTIC_HOST) | +| `--tag tag[,tag,...]` | | only consider snapshots including `tag[,tag,...]` (can be specified multiple times) (default []) | +| `--path path` | | only consider snapshots including this (absolute) path (can be specified multiple times, snapshots must include all specified paths) | +| `-c`, `--compact` | | use compact output format | +| `-g`, `--group-by group` | | group snapshots by host, paths and/or tags, separated by comma (disable grouping with '') (default host,paths) | +| `-n`, `--dry-run` | | do not delete anything, just print what would be done | +| `--prune` | | automatically run the 'prune' command if snapshots have been removed | +| `--max-unused limit` | | tolerate given limit of unused data (absolute bytes with suffixes k/K, m/M, g/G, t/T, %, or 'unlimited') (default "5%") | +| `--max-repack-size size` | | stop after repacking this much data in total (allowed suffixes: k/K, m/M, g/G, t/T) | +| `--repack-cacheable-only` | | only repack packs which are cacheable | +| `--repack-small` | | repack pack files below 80% of target pack size | +| `--repack-uncompressed` | | repack all uncompressed data | +| `--repack-smaller-than below-limit` | | pack below-limit packfiles (allowed suffixes: k/K, m/M) | + +### init + +The "init" command initializes a new repository. + +Exit Codes: +- Exit status is 0 if the command was successful. +- Exit status is 1 if there was any error. + +Usage: `restic init [flags]` + +| Option | Environment | Description | +| ----------------------------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------- | +| `--copy-chunker-params` | | Copy chunker parameters from the secondary repository (useful with the copy command) | +| `--from-insecure-no-password` | | Use an empty password for the source repository (insecure) | +| `--from-key-hint` | `$RESTIC_FROM_KEY_HINT` | Key ID of key to try decrypting the source repository first | +| `--from-password-command` | `$RESTIC_FROM_PASSWORD_COMMAND` | Shell command to obtain the source repository password from | +| `--from-password-file` | `$RESTIC_FROM_PASSWORD_FILE` | File to read the source repository password from | +| `--from-repo` | `$RESTIC_FROM_REPOSITORY` | Source repository to copy chunker parameters from | +| `--from-repository-file` | `$RESTIC_FROM_REPOSITORY_FILE` | File from which to read the source repository location to copy chunker parameters from | +| `--repository-version` | | Repository format version to use, allowed values are a format version, `latest` and `stable` (default "stable") | + +### key + +The "key" command allows you to set multiple access keys or passwords per repository. + +Usage: `restic key [command]` + +#### key add +Add a new key (password) to the repository; returns the new key ID + +Usage: `restic key add [flags]` + +| Option | Environment | Description | +| ---------------------------- | ----------- | --------------------------------------------------- | +| `-h`, `--help` | | help for add | +| `--host string` | | the hostname for new key | +| `--new-insecure-no-password` | | add an empty password for the repository (insecure) | +| `--new-password-file file` | | file from which to read the new password | +| `--user string` | | the username for new key | + +#### key passwd +Change key (password); creates a new key ID and removes the old key ID, returns new key ID + +Usage: `restic key passwd [flags]` + +| Option | Environment | Description | +| ---------------------------- | ----------- | --------------------------------------------------- | +| `-h`, `--help` | | help for add | +| `--host string` | | the hostname for new key | +| `--new-insecure-no-password` | | add an empty password for the repository (insecure) | +| `--new-password-file file` | | file from which to read the new password | +| `--user string` | | the username for new key | + +#### key list +List keys (passwords) + +Usage: `restic key list` + +#### key remove +Remove key ID (password) from the repository. + +Usage: `restic key remove [ID] [flags]` + +### list + +The "list" command allows listing objects in the repository based on type. + +Exit Codes: +- Exit status is 0 if the command was successful. +- Exit status is 1 if there was any error. +- Exit status is 10 if the repository does not exist. +- Exit status is 11 if the repository is already locked. +- Exit status is 12 if the password is incorrect. + +Usage: `restic list [flags] [blobs|packs|index|snapshots|keys|locks]` + +### ls + +The "ls" command lists files and directories in a snapshot. + +The special snapshot ID "latest" can be used to list files and directories of the latest snapshot in the repository. The `--host` flag can be used in conjunction to select the latest snapshot originating from a certain host only. + +File listings can optionally be filtered by directories. Any positional arguments after the snapshot ID are interpreted as absolute directory paths, and only files inside those directories will be listed. If the `--recursive` flag is used, then the filter will allow traversing into matching directories' subfolders. +Any directory paths specified must be absolute (starting with a path separator); paths use the forward slash '/' as separator. + +File listings can be sorted by specifying `--sort` followed by one of the sort specifiers `(name|size|time=mtime|atime|ctime|extension)`. +The sorting can be reversed by specifying `--reverse`. + +Exit Codes: +- Exit status is 0 if the command was successful. +- Exit status is 1 if there was any error. +- Exit status is 10 if the repository does not exist. +- Exit status is 11 if the repository is already locked. +- Exit status is 12 if the password is incorrect. + +Usage: `restic ls [flags] snapshotID [dir...]` + +| Option | Environment | Description | +| ------------------ | -------------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| `-H`, `--host` | `$RESTIC_HOST` | Only consider snapshots for this host, when snapshot ID "latest" is given (can be specified multiple times) | +| `--human-readable` | | Print sizes in human readable format | +| `-l`, `--long` | | Use a long listing format showing size and mode | +| `--ncdu` | | Output NCDU export format (pipe into `ncdu -f -`) | +| `--path` | | Only consider snapshots including this (absolute) path, when snapshot ID "latest" is given (can be specified multiple times) | +| `--recursive` | | Include files in subfolders of the listed directories | +| `--reverse` | | Reverse sorted output | +| `-s`, `--sort` | | Sort output by (name\|size\|time=mtime\|atime\|ctime\|extension) (default name) | +| `--tag` | | Only consider snapshots including tag[,tag,...], when snapshot ID "latest" is given (can be specified multiple times) (default []) | + +### mount + +The "mount" command mounts the repository via fuse to a directory. This is a read-only mount. + +**Snapshot Directories**: +If you need a different template for directories that contain snapshots, +you can pass a time template via `--time-template` and path templates via `--path-template`. + +Example time template without colons: `--time-template "2006-01-02_15-04-05"` + +You need to specify a sample format for exactly the following timestamp: `Mon Jan 2 15:04:05 -0700 MST 2006` + +For path templates, you can use the following patterns which will be replaced: +- `%i` by short snapshot ID +- `%I` by long snapshot ID +- `%u` by username +- `%h` by hostname +- `%t` by tags +- `%T` by timestamp as specified by `--time-template` + +The default path templates are: +- `ids/%i` +- `snapshots/%T` +- `hosts/%h/%T` +- `tags/%t/%T` + +Exit Codes: +- Exit status is 0 if the command was successful. +- Exit status is 1 if there was any error. +- Exit status is 10 if the repository does not exist. +- Exit status is 11 if the repository is already locked. +- Exit status is 12 if the password is incorrect. + +Usage: `restic mount [flags] mountpoint` + +| Option | Environment | Description | +| -------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `--allow-other` | | Allow other users to access the data in the mounted directory | +| `-H`, `--host` | `$RESTIC_HOST` | Only consider snapshots for this host (can be specified multiple times) | +| `--no-default-permissions` | | For `--allow-other`, ignore Unix permissions and allow users to read all snapshot files | +| `--owner-root` | | Use `root` as the owner of files and dirs | +| `--path` | | Only consider snapshots including this (absolute) path (can be specified multiple times, snapshots must include all specified paths) | +| `--path-template` | | Set template for path names (can be specified multiple times) | +| `--tag` | | Only consider snapshots including `tag[,tag,...]` (can be specified multiple times) (default []) | +| `--time-template` | | Set template to use for times (default "2006-01-02T15:04:05Z07:00") | + +### prune + +The "prune" command checks the repository and removes data that is not referenced and therefore not needed any more. + +Usage: `restic prune [flags]` + +| Option | Environment | Description | +| -------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-n`, `--dry-run` | | Do not modify the repository, just print what would be done | +| `--max-repack-size` | | Stop after repacking this much data in total (allowed suffixes: k/K, m/M, g/G, t/T) | +| `--max-unused` | | Tolerate given limit of unused data (absolute value in bytes with suffixes k/K, m/M, g/G, t/T, a value in % or the word 'unlimited') (default "5%") | +| `--repack-cacheable-only` | | Only repack packs which are cacheable | +| `--repack-small` | | Repack pack files below 80% of target pack size | +| `--repack-smaller-than` | | Pack below-limit packfiles (allowed suffixes: k/K, m/M) | +| `--repack-uncompressed` | | Repack all uncompressed data | +| `--unsafe-recover-no-free-space` | | **UNSAFE**, read the documentation before using! Try to recover a repository stuck with no free space. Do not use without trying 'prune --max-repack-size 0' first. | + + +### restore + +The "restore" command extracts the data from a snapshot from the repository to a directory. + +The special snapshotID "latest" can be used to restore the latest snapshot in the repository. + +To only restore a specific subfolder, you can use the `snapshotID:subfolder` syntax, where `subfolder` is a path within the snapshot. + +Usage: `restic restore [flags] snapshotID` + +| Option | Environment | Description | +| ----------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `--delete` | | Delete files from target directory if they do not exist in snapshot. Use `--dry-run -vv` to check what would be deleted | +| `--dry-run` | | Do not write any data, just show what would be done | +| `-e`, `--exclude` | | Exclude a pattern (can be specified multiple times) | +| `--exclude-file` | | Read exclude patterns from a file (can be specified multiple times) | +| `--exclude-xattr` | | Exclude xattr by pattern (can be specified multiple times) | +| `-H`, `--host` | `$RESTIC_HOST` | Only consider snapshots for this host, when snapshot ID "latest" is given (can be specified multiple times) | +| `--iexclude` | | Same as `--exclude` but ignores the casing of filenames | +| `--iexclude-file` | | Same as `--exclude-file` but ignores casing of filenames in patterns | +| `--iinclude` | | Same as `--include` but ignores the casing of filenames | +| `--iinclude-file` | | Same as `--include-file` but ignores casing of filenames in patterns | +| `-i`, `--include` | | Include a pattern (can be specified multiple times) | +| `--include-file` | | Read include patterns from a file (can be specified multiple times) | +| `--include-xattr` | | Include xattr by pattern (can be specified multiple times) | +| `--overwrite` | | Overwrite behavior, one of (always\|if-changed\|if-newer\|never) (default always) | +| `--path` | | Only consider snapshots including this (absolute) path, when snapshot ID "latest" is given (can be specified multiple times) | +| `--sparse` | | Restore files as sparse | +| `--tag` | | Only consider snapshots including `tag[,tag,...]`, when snapshot ID "latest" is given (can be specified multiple times) (default []) | +| `-t`, `--target` | | Directory to extract data to | +| `--verify` | | Verify restored files content | + +### rewrite + +The "rewrite" command excludes files from existing snapshots. It creates new snapshots containing the same data as the original ones, but without the files you specify to exclude. All metadata (time, host, tags) will be preserved. + +The snapshots to rewrite are specified using the `--host`, `--tag` and `--path` options, or by providing a list of snapshot IDs. Please note that specifying neither any of these options nor a snapshot ID will cause the command to rewrite all snapshots. + +The special tag 'rewrite' will be added to the new snapshots to distinguish them from the original ones, unless `--forget` is used. If the `--forget` option is used, the original snapshots will instead be directly removed from the repository. + +Please note that the `--forget` option only removes the snapshots and not the actual data stored in the repository. In order to delete the no longer referenced data, use the "prune" command. + +When rewrite is used with the `--snapshot-summary` option, a new snapshot is created containing statistics summary data. Only two fields in the summary will be non-zero: TotalFilesProcessed and TotalBytesProcessed. + +When rewrite is called with one of the `--exclude` options, TotalFilesProcessed and TotalBytesProcessed will be updated in the snapshot summary. + +Usage: `restic rewrite [flags] [snapshotID ...]` + +| Option | Environment | Description | +| -------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `-n`, `--dry-run` | | Do not do anything, just print what would be done | +| `-e`, `--exclude` | | Exclude a pattern (can be specified multiple times) | +| `--exclude-file` | | Read exclude patterns from a file (can be specified multiple times) | +| `--forget` | | Remove original snapshots after creating new ones | +| `-H`, `--host` | `$RESTIC_HOST` | Only consider snapshots for this host (can be specified multiple times) | +| `--iexclude` | | Same as `--exclude` but ignores the casing of filenames | +| `--iexclude-file` | | Same as `--exclude-file` but ignores casing of filenames in patterns | +| `--new-host` | | Replace hostname | +| `--new-time` | | Replace time of the backup | +| `--path` | | Only consider snapshots including this (absolute) path (can be specified multiple times; snapshots must include all specified paths) | +| `-s`, `--snapshot-summary` | | Create snapshot summary record if it does not exist | +| `--tag` | | Only consider snapshots including tag\[,tag,...] (can be specified multiple times) (default: `[]`) | + +### snapshots + +The "snapshots" command lists all snapshots stored in the repository. + +Usage: `restic snapshots [flags] [snapshotID ...]` + +| Option | Environment | Description | +| ---------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `-c, --compact` | | use compact output format | +| `-g, --group-by group` | | group snapshots by host, paths and/or tags, separated by comma | +| `-H, --host host` | `$RESTIC_HOST` | only consider snapshots for this host (can be specified multiple times) | +| `--latest n` | | only show the last n snapshots for each host and path | +| `--path path` | | only consider snapshots including this (absolute) path (can be specified multiple times, snapshots must include all specified paths) | +| `--tag tag[,tag,...]` | | only consider snapshots including `tag[,tag,...]` (can be specified multiple times) (default []) | + +### stats + +The "stats" command walks one or multiple snapshots in a repository and accumulates statistics about the data stored therein. It reports on the number of unique files and their sizes, according to one of the counting modes as given by the `--mode` flag. + +It operates on all snapshots matching the selection criteria or all snapshots if nothing is specified. The special snapshot ID "latest" is also supported. Some modes make more sense over just a single snapshot, while others are useful across all snapshots, depending on what you are trying to calculate. + +The modes are: + +* restore-size: (default) Counts the size of the restored files. +* files-by-contents: Counts total size of unique files, where a file is considered unique if it has unique contents. +* raw-data: Counts the size of blobs in the repository, regardless of how many files reference them. +* blobs-per-file: A combination of files-by-contents and raw-data. + +Refer to the online manual for more details about each mode. + +Usage: `restic stats [flags] [snapshot ID] [...]` + +| Option | Environment | Description | +| --------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `-H, --host host` | `$RESTIC_HOST` | only consider snapshots for this host (can be specified multiple times) | +| `--mode string` | | counting mode: restore-size (default), files-by-contents, blobs-per-file or raw-data (default "restore-size") | +| `--path path` | | only consider snapshots including this (absolute) path (can be specified multiple times, snapshots must include all specified paths) | +| `--tag tag[,tag,...]` | | only consider snapshots including `tag[,tag,...]` (can be specified multiple times) (default []) | + +### tag + +The "tag" command allows you to modify tags on exiting snapshots. + +You can either set/replace the entire set of tags on a snapshot, or add tags to/remove tags from the existing set. + +When no snapshotID is given, all snapshots matching the host, tag and path filter criteria are modified. + +Usage: `restic tag [flags] [snapshotID ...]` + +| Option | Environment | Description | +| --------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `--add tags` | | tags which will be added to the existing tags in the format `tag[,tag,...]` (can be given multiple times) (default []) | +| `-H, --host host` | `$RESTIC_HOST` | only consider snapshots for this host (can be specified multiple times) (default: $RESTIC_HOST) | +| `--path path` | | only consider snapshots including this (absolute) path (can be specified multiple times, snapshots must include all specified paths) | +| `--remove tags` | | tags which will be removed from the existing tags in the format `tag[,tag,...]` (can be given multiple times) (default []) | +| `--set tags` | | tags which will replace the existing tags in the format `tag[,tag,...]` (can be given multiple times) (default []) | +| `--tag tag[,tag,...]` | | only consider snapshots including tag[,tag,...] (can be specified multiple times) (default []) | + +### unlock +The "unlock" command removes stale locks that have been created by other restic processes. + +Usage: `restic unlock [--remove-all] [flags]` From 557a61c4187373a70f8e5e9c61873444a295f91a Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Sat, 21 Jun 2025 00:42:27 +0200 Subject: [PATCH 88/99] update applications --- technology/applications/Applications.md | 35 +++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 5ac52a2..20e0e93 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -39,6 +39,7 @@ rev: 2025-01-30 ## Desktop - [KDE Plasma](./desktops/KDE%20Plasma.md) - [SDDM](./desktops/SDDM.md) +- [spectacle](./desktops/spectacle.md) - [dwm](./desktops/dwm.md) - [picom](./desktops/picom.md) - [Hyprland](./desktops/hyprland.md) @@ -51,21 +52,23 @@ rev: 2025-01-30 - [DB Browser for SQLite](./development/DB%20Browser%20for%20SQLite.md) - [Ghidra](./development/Ghidra.md) - [GitHub Desktop](./development/GitHub%20Desktop.md) +- [delta](./development/delta.md) - [HTTPie](./development/HTTPie.md) - [MongoDB Compass](./development/MongoDB%20Compass.md) - [MongoDB](./development/MongoDB.md) -- [Postgres](./development/Postgres.md) +- [PostgreSQL](./development/Postgres.md) - [Podman Desktop](./development/Podman%20Desktop.md) - [Visual Studio Code](./development/Visual%20Studio%20Code.md) - [continue](./development/continue.md) - [psequel](development/psequel.md) -- [PostgreSQL](development/Postgres.md) +- [Valkey](./development/valkey.md) ## Documents - [Tachiyomi](./documents/Tachiyomi.md) - [LibreOffice](./office/LibreOffice.md) - [Obsidian](./office/Obsidian.md) - [Typst](../tools/Typst.md) +- [mdbook](./office/mdbook.md) ## Finance - [Feather Wallet](./finance/Feather%20Wallet.md) @@ -77,6 +80,8 @@ rev: 2025-01-30 - [Lutris](./gaming/Lutris.md) - [Steam](./gaming/Steam.md) - [Steam ROM Manager](./gaming/Steam%20ROM%20Manager.md) +- [dualsensectl](./gaming/dualsensectl.md) +- [MangoHUD](./gaming/MangoHUD.md) ## Network - [JDownloader](./network/JDownloader.md) @@ -120,6 +125,7 @@ rev: 2025-01-30 - [Wildcard](utilities/Wildcard.md) - [Textpieces](utilities/Textpieces.md) - [ImHex](utilities/ImHex.md) +- [Octopi](utilities/octopi.md) # Mobile - [Aegis](./utilities/Aegis.md) @@ -168,6 +174,15 @@ rev: 2025-01-30 - [Caddy](./web/Caddy.md) - [zigbee2MQTT](./web/zigbee2mqtt.md) - [dawarich](./web/dawarich.md) +- [glance](./web/glance.md) +- [ntfy](./web/ntfy.md) +- [owncast](./web/owncast.md) +- [panamax](./web/panamax.md) +- [stalwart](./web/stalwart.md) +- [OpenGist](./web/opengist.md) +- [SFTPGo](./web/sftpgo.md) +- [Lemmy](./web/lemmy.md) +- [Stump](./web/stump.md) # CLI ## Terminal @@ -177,6 +192,8 @@ rev: 2025-01-30 - [Shell](./cli/Shell.md) - [bash](./cli/bash.md) - [zsh](./cli/zsh.md) +- [fish](./cli/fish.md) +- [starship](./cli/starship.md) ## Compression - [p7zip](./cli/compression/p7zip.md) @@ -236,6 +253,7 @@ rev: 2025-01-30 - [GPG](../cryptography/GPG.md) - [OpenSSL](../cryptography/OpenSSL.md) - [age](../cryptography/age.md) +- [minisign](../cryptography/minisign.md) - [tomb](./cli/tomb.md) - [dysk](./cli/dysk.md) - [pass](./cli/pass.md) @@ -250,6 +268,7 @@ rev: 2025-01-30 - [rexturl](./cli/rexturl.md) - [mhost](./cli/mhost.md) - [timr-tui](./cli/timr-tui.md) +- [skate](./cli/skate.md) ## System - [Core Utils](./cli/system/Core%20Utils.md) @@ -266,6 +285,8 @@ rev: 2025-01-30 - [systemd-cryptenroll](../linux/systemd/systemd-cryptenroll.md) - [bubblewrap](./utilities/bubblewrap.md) - [retry-cli](./utilities/retry-cli.md) +- [systeroid](./utilities/systeroid.md) +- [distrobox](./utilities/distrobox.md) ## Development - [act](./development/act.md) @@ -278,10 +299,15 @@ rev: 2025-01-30 - [Ansible](../tools/Ansible/Ansible.md) - [Docker](../tools/Docker.md) - [Podman](../tools/Podman.md) +- [sops](../tools/sops.md) - [serie](./cli/serie.md) - [usql](./cli/usql.md) - [kondo](./cli/kondo.md) - [licensit](./development/licensit.md) +- [onefetch](./development/onefetch.md) +- [ruff](./development/ruff.md) +- [uv](./development/uv.md) +- [rust-script](./development/rust-script.md) ## Media - [yt-dlp](./media/yt-dlp.md) @@ -290,6 +316,10 @@ rev: 2025-01-30 - [ImageMagick](./media/ImageMagick.md) - [pywal](./media/images/pywal.md) - [viu](./cli/viu.md) +- [wallust](./media/wallust.md) +- [artem](./media/artem.md) +- [auto-palette-cli](./media/auto-palette-cli.md) +- [metadata](./media/metadata-cli.md) ## Network - [rclone](./network/rclone.md) @@ -317,3 +347,4 @@ rev: 2025-01-30 ## Backup - [borg](./backup/borg.md) - [borgmatic](./backup/borgmatic.md) +- [restic](./backup/restic.md) From 9ec7a79348d98df1bd21b5f6da15eab108cbebc0 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Sat, 21 Jun 2025 04:06:10 +0200 Subject: [PATCH 89/99] add renovate --- technology/applications/Applications.md | 1 + .../applications/development/renovate.md | 58 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 technology/applications/development/renovate.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 20e0e93..e3c3140 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -308,6 +308,7 @@ rev: 2025-01-30 - [ruff](./development/ruff.md) - [uv](./development/uv.md) - [rust-script](./development/rust-script.md) +- [renovatebot](./development/renovate.md) ## Media - [yt-dlp](./media/yt-dlp.md) diff --git a/technology/applications/development/renovate.md b/technology/applications/development/renovate.md new file mode 100644 index 0000000..8ea8e73 --- /dev/null +++ b/technology/applications/development/renovate.md @@ -0,0 +1,58 @@ +--- +obj: application +website: https://docs.renovatebot.com +repo: https://github.com/renovatebot/renovate +--- + +# RenovateBot + +RenovateBot is a powerful open-source tool that automates the process of updating dependencies in your codebase. It scans your project files, identifies outdated packages, and creates pull requests to update them—keeping your dependencies secure and up to date with minimal manual intervention. + +## Setup +Setup a user for renovate on your preferred git forge and get a PAT to authenticate. + +Then add this user as a member to your repositories. Renovate can then be configured through a `renovate.json` config file per repository. + +## K8s Manifest +```yml +apiVersion: batch/v1 +kind: CronJob +metadata: + name: renovate +spec: + schedule: '@hourly' + concurrencyPolicy: Forbid + jobTemplate: + spec: + template: + spec: + containers: + - name: renovate + # Update this to the latest available and then enable Renovate on + # the manifest + image: renovate/renovate:40.57.0 + args: + - user/repo + # Environment Variables + env: + - name: LOG_LEVEL + value: debug + envFrom: + - secretRef: + name: renovate-env + restartPolicy: Never +--- +apiVersion: v1 +kind: Secret +metadata: + name: renovate-env +type: Opaque +stringData: + RENOVATE_GITHUB_COM_TOKEN: 'any-personal-user-token-for-github-com-for-fetching-changelogs' + # You can set RENOVATE_AUTODISCOVER to true to run Renovate on all repos you have push access to + RENOVATE_AUTODISCOVER: 'false' + RENOVATE_ENDPOINT: 'https://github.company.com/api/v3' + RENOVATE_GIT_AUTHOR: 'Renovate Bot <bot@renovateapp.com>' + RENOVATE_PLATFORM: 'github' + RENOVATE_TOKEN: 'your-github-enterprise-renovate-user-token' +``` From 0a4140ae8cf21cf5abb06daf15a0dd4e26a2f294 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Sat, 21 Jun 2025 04:09:59 +0200 Subject: [PATCH 90/99] rm todo --- technology/applications/development/Ghidra.md | 2 -- technology/dev/programming/frameworks/Dioxus.md | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/technology/applications/development/Ghidra.md b/technology/applications/development/Ghidra.md index dbc4122..b0a93b8 100644 --- a/technology/applications/development/Ghidra.md +++ b/technology/applications/development/Ghidra.md @@ -5,8 +5,6 @@ repo: https://github.com/NationalSecurityAgency/ghidra rev: 2024-04-15 --- -#refactor - # Ghidra Ghidra is a powerful open-source software reverse engineering (SRE) suite developed by the National Security Agency (NSA) that enables users to analyze compiled code to understand its functionality, vulnerabilities, and inner workings. diff --git a/technology/dev/programming/frameworks/Dioxus.md b/technology/dev/programming/frameworks/Dioxus.md index 9f77faf..9ca21c6 100644 --- a/technology/dev/programming/frameworks/Dioxus.md +++ b/technology/dev/programming/frameworks/Dioxus.md @@ -177,11 +177,11 @@ enum Route { } fn Home() -> Element { - todo!() + // HomePage... } fn Blog() -> Element { - todo!() + // BlogPage... } ``` From 9b15512ff6e733abfeb58a0140847f185019728f Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Sat, 21 Jun 2025 07:46:07 +0200 Subject: [PATCH 91/99] add trailsense --- technology/applications/Applications.md | 1 + technology/applications/mobile/TrailSense.avif | Bin 0 -> 20105 bytes technology/applications/mobile/TrailSense.md | 11 +++++++++++ 3 files changed, 12 insertions(+) create mode 100644 technology/applications/mobile/TrailSense.avif create mode 100644 technology/applications/mobile/TrailSense.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index e3c3140..cc3af9c 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -139,6 +139,7 @@ rev: 2025-01-30 - [Google Calendar](./office/Google%20Calendar.md) - [Google Contacts](./office/Google%20Contacts.md) - [OwnTracks](./mobile/OwnTracks.md) +- [TrailSense](./mobile/TrailSense.md) # Web - [Authelia](./web/Authelia.md) diff --git a/technology/applications/mobile/TrailSense.avif b/technology/applications/mobile/TrailSense.avif new file mode 100644 index 0000000000000000000000000000000000000000..d5bad1f9a26776012d4252d46c6e1c5ab6421ba3 GIT binary patch literal 20105 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 bw=o3+RPu-hQr*1SJyW4h7>T1=*vx*AAF~t4 literal 0 HcmV?d00001 diff --git a/technology/applications/mobile/TrailSense.md b/technology/applications/mobile/TrailSense.md new file mode 100644 index 0000000..b40be4c --- /dev/null +++ b/technology/applications/mobile/TrailSense.md @@ -0,0 +1,11 @@ +--- +obj: application +repo: https://github.com/kylecorry31/Trail-Sense +android-id: com.kylecorry.trail_sense +--- + +# TrailSense + +**Trail Sense** is a powerful, offline-first Android app that transforms your phone into a wilderness survival toolkit . + +![Screenshot](TrailSense.avif) From 2319bfb378b56f9e1d8b7d4fc6ad55227f70782d Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Sat, 21 Jun 2025 09:59:49 +0200 Subject: [PATCH 92/99] add k8s --- technology/applications/Applications.md | 2 + technology/tools/k3s.md | 76 ++++++ technology/tools/k9s.avif | Bin 0 -> 144237 bytes technology/tools/k9s.md | 11 + technology/tools/kubernetes.md | 343 ++++++++++++++++++++++++ 5 files changed, 432 insertions(+) create mode 100644 technology/tools/k3s.md create mode 100644 technology/tools/k9s.avif create mode 100644 technology/tools/k9s.md create mode 100644 technology/tools/kubernetes.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index cc3af9c..94ea8d9 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -300,6 +300,8 @@ rev: 2025-01-30 - [Ansible](../tools/Ansible/Ansible.md) - [Docker](../tools/Docker.md) - [Podman](../tools/Podman.md) +- [k3s](../tools/k3s.md) +- [k9s](../tools/k9s.md) - [sops](../tools/sops.md) - [serie](./cli/serie.md) - [usql](./cli/usql.md) diff --git a/technology/tools/k3s.md b/technology/tools/k3s.md new file mode 100644 index 0000000..94ae2e5 --- /dev/null +++ b/technology/tools/k3s.md @@ -0,0 +1,76 @@ +--- +obj: application +website: https://k3s.io +repo: https://github.com/k3s-io/k3s +--- + +# k3s + +K3s is a certified [Kubernetes](./kubernetes.md) distribution developed by Rancher (now part of SUSE). It is designed to be lightweight, simple to install, and optimized for resource-constrained environments such as edge computing, IoT devices, and development setups. + +## Installation +K3s provides an installation script that is a convenient way to install it as a service on systemd or openrc based systems. This script is available at https://get.k3s.io. To install K3s using this method, just run: + +```sh +curl -sfL https://get.k3s.io | sh - +``` + +After running this installation: + +- The K3s service will be configured to automatically restart after node reboots or if the process crashes or is killed +- Additional utilities will be installed, including `kubectl`, `crictl`, `ctr`, `k3s-killall.sh`, and `k3s-uninstall.sh` +- A kubeconfig file will be written to `/etc/rancher/k3s/k3s.yaml` and the `kubectl` installed by K3s will automatically use it + +A single-node server installation is a fully-functional Kubernetes cluster, including all the datastore, control-plane, kubelet, and container runtime components necessary to host workload pods. It is not necessary to add additional server or agents nodes, but you may want to do so to add additional capacity or redundancy to your cluster. + +To install additional agent nodes and add them to the cluster, run the installation script with the `K3S_URL` and `K3S_TOKEN` environment variables. Here is an example showing how to join an agent: + +```sh +curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh - +``` + +Setting the `K3S_URL` parameter causes the installer to configure K3s as an agent, instead of a server. The K3s agent will register with the K3s server listening at the supplied URL. The value to use for `K3S_TOKEN` is stored at `/var/lib/rancher/k3s/server/node-token` on your server node. + +## HA (Embedded etcd) +To get started, first launch a server node with the `cluster-init` flag to enable clustering and a token that will be used as a shared secret to join additional servers to the cluster. + +```sh +curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - server \ + --cluster-init \ + --tls-san=<FIXED_IP> # Optional, needed if using a fixed registration address +``` + +After launching the first server, join the second and third servers to the cluster using the shared secret: + +```sh +curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - server \ + --server https://<ip or hostname of server1>:6443 \ + --tls-san=<FIXED_IP> # Optional, needed if using a fixed registration address +``` + +Check to see that the second and third servers are now part of the cluster: + +``` +$ kubectl get nodes +NAME STATUS ROLES AGE VERSION +server1 Ready control-plane,etcd,master 28m vX.Y.Z +server2 Ready control-plane,etcd,master 13m vX.Y.Z +server3 Ready control-plane,etcd,master 10m vX.Y.Z +``` + +Now you have a highly available control plane. Any successfully clustered servers can be used in the `--server` argument to join additional server and agent nodes. Joining additional agent nodes to the cluster follows the same procedure as servers: + +```sh +curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - agent --server https://<ip or hostname of server>:6443 +``` + +There are a few config flags that must be the same in all server nodes: + +- Network related flags: `--cluster-dns`, `--cluster-domain`, `--cluster-cidr`, `--service-cidr` +- Flags controlling the deployment of certain components: `--disable-helm-controller`, `--disable-kube-proxy`, `--disable-network-policy` and any component passed to `--disable` +- Feature related flags: `--secrets-encryption` + +### Existing single-node clusters +If you have an existing cluster using the default embedded SQLite database, you can convert it to etcd by simply restarting your K3s server with the `--cluster-init` flag. Once you've done that, you'll be able to add additional instances as described above. + +If an etcd datastore is found on disk either because that node has either initialized or joined a cluster already, the datastore arguments (`--cluster-init`, `--server`, `--datastore-endpoint`, etc) are ignored. diff --git a/technology/tools/k9s.avif b/technology/tools/k9s.avif new file mode 100644 index 0000000000000000000000000000000000000000..c252fedd4206b4687869a40f435ecfd84a16409d GIT binary patch literal 144237 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Ð!PILsEvs$Go|$o9#QbIadaD4kH=t1^$p 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�C6!B~c0JUzT~G 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 literal 0 HcmV?d00001 diff --git a/technology/tools/k9s.md b/technology/tools/k9s.md new file mode 100644 index 0000000..e1cb025 --- /dev/null +++ b/technology/tools/k9s.md @@ -0,0 +1,11 @@ +--- +obj: application +website: https://k9scli.io +repo: https://github.com/derailed/k9s +--- + +# k9s + +K9s is a terminal based UI to interact with your Kubernetes clusters. The aim of this project is to make it easier to navigate, observe and manage your deployed applications in the wild. K9s continually watches Kubernetes for changes and offers subsequent commands to interact with your observed resources. + +![Screenshot](k9s.avif) diff --git a/technology/tools/kubernetes.md b/technology/tools/kubernetes.md new file mode 100644 index 0000000..7a6f1f8 --- /dev/null +++ b/technology/tools/kubernetes.md @@ -0,0 +1,343 @@ +--- +obj: concept +website: https://kubernetes.io +--- + +# Kubernetes + +## Overview + +Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications. It groups containers into logical units called **Pods**, which run on **Nodes** in a cluster. A simple solution to get up and running is [k3s](k3s.md). + +You can manage k8s clusters via `kubectl`. Most things are defined via yaml manifest files decleratively. You can throw these into your cluster with `kubectl apply -f FILE`. + +## Resources + +### Namespace + +Logical separation of resources within a cluster. + +```yaml +apiVersion: v1 +kind: Namespace +metadata: + name: example-namespace +``` + +### Pod + +The smallest deployable unit in Kubernetes. + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: full-example-pod + namespace: example-namespace + labels: + app: web + tier: frontend + annotations: + description: "A full-featured pod example for demonstration purposes" +spec: + restartPolicy: Always + + # Init container (runs before main containers) + initContainers: + - name: init-permissions + image: busybox + command: ["sh", "-c", "chmod 777 /mnt/data"] + volumeMounts: + - name: data-volume + mountPath: /mnt/data + + containers: + - name: main-app + image: nginx:1.25 + imagePullPolicy: IfNotPresent + ports: + - containerPort: 80 + name: http + env: + # Environment + - name: ENVIRONMENT + value: production + + # Env from ConfigMap + - name: CONFIG_TIMEOUT + valueFrom: + configMapKeyRef: + name: example-config + key: TIMEOUT + + # Env from Secret + - name: SECRET_PASSWORD + valueFrom: + secretKeyRef: + name: example-secret + key: password + volumeMounts: + - name: data-volume + mountPath: /usr/share/nginx/html + - name: config-volume + mountPath: /etc/config + readOnly: true + resources: + limits: + cpu: "500m" + memory: "256Mi" + requests: + cpu: "250m" + memory: "128Mi" + livenessProbe: + httpGet: + path: / + port: 80 + initialDelaySeconds: 10 + periodSeconds: 10 + readinessProbe: + httpGet: + path: / + port: 80 + initialDelaySeconds: 5 + periodSeconds: 5 + lifecycle: + preStop: + exec: + command: ["sh", "-c", "echo stopping..."] + + - name: sidecar-logger + image: busybox + args: ["sh", "-c", "tail -f /var/log/app.log"] + volumeMounts: + - name: log-volume + mountPath: /var/log + + # Volumes + volumes: + # ConfigMap - inject config files + - name: config-volume + configMap: + name: example-config + items: + - key: config.json + path: config.json + + # Secret - inject sensitive data + - name: secret-volume + secret: + secretName: example-secret + items: + - key: password + path: password.txt + + # EmptyDir - ephemeral shared storage between containers + - name: log-volume + emptyDir: + medium: "" + sizeLimit: 500Mi + + # HostPath - access host node's filesystem (example: logs) + - name: host-logs + hostPath: + path: /var/log + type: Directory +``` + +### Deployment + +Ensures a specified number of identical Pods are running and up-to-date. Supports rolling updates and rollbacks. + +```yml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: example-deployment + namespace: example-namespace +spec: + replicas: 3 + selector: + matchLabels: + app: example + template: + metadata: + labels: + app: example + spec: + containers: + - name: web + image: nginx:alpine + ports: + - containerPort: 80 +``` + +### StatefulSet + +Like a Deployment, but for workloads requiring stable network IDs, persistent storage, and ordered startup/shutdown. + +```yml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: example-statefulset + namespace: example-namespace +spec: + serviceName: "example" + replicas: 2 + selector: + matchLabels: + app: stateful-app + template: + metadata: + labels: + app: stateful-app + spec: + containers: + - name: web + image: nginx:alpine + volumeMounts: + - name: data + mountPath: /usr/share/nginx/html +``` + +### DaemonSet + +Ensures a copy of a Pod runs on all (or some) Nodes in the cluster. Ideal for log collectors or system-level agents. + +```yml +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: example-daemonset + namespace: example-namespace +spec: + selector: + matchLabels: + name: ds-app + template: + metadata: + labels: + name: ds-app + spec: + containers: + - name: node-monitor + image: busybox + args: ["sh", "-c", "while true; do echo hello; sleep 10; done"] +``` + +### Job + +Runs a Pod (or multiple) to completion. Used for batch processing or one-off tasks. + +```yml +apiVersion: batch/v1 +kind: Job +metadata: + name: example-job + namespace: example-namespace +spec: + template: + spec: + containers: + - name: pi + image: perl + command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] + restartPolicy: Never + backoffLimit: 4 +``` + +### CronJob + +Schedules Jobs to run periodically, similar to [UNIX cron](../linux/cron.md). + +```yml +apiVersion: batch/v1 +kind: CronJob +metadata: + name: example-cronjob + namespace: example-namespace +spec: + schedule: "*/5 * * * *" + jobTemplate: + spec: + template: + spec: + containers: + - name: hello + image: busybox + args: ["echo", "Hello from the CronJob"] + restartPolicy: OnFailure +``` + +> Note: You can quickly run CronJobs as a job with: `kubectl create job --from=cronjob.batch/my_cron_job new_job` + +### Service + +Defines a stable network endpoint to access a set of Pods. Supports different types like `ClusterIP`, `NodePort`, and `LoadBalancer`. + +```yml +apiVersion: v1 +kind: Service +metadata: + name: example-service + namespace: example-namespace +spec: + selector: + app: example + ports: + - protocol: TCP + port: 80 + targetPort: 80 + type: ClusterIP +``` + +### ConfigMap + +Injects configuration data (as key-value pairs) into Pods, keeping config decoupled from code. + +```yml +apiVersion: v1 +kind: ConfigMap +metadata: + name: example-config + namespace: example-namespace +data: + APP_ENV: production + TIMEOUT: "30" +``` + +Usage in a Pod: + +```yml +envFrom: + - configMapRef: + name: example-config +``` + +### Secret + +Similar to ConfigMap, but for sensitive data like passwords, tokens, or keys. +If you want encryption on rest for your manifests, look at [sops](../tools/sops.md). + +```yml +apiVersion: v1 +kind: Secret +metadata: + name: example-secret + namespace: example-namespace +type: Opaque +data: + username: YWRtaW4= # base64 of 'admin' + password: cGFzc3dvcmQ= # base64 of 'password' +``` + +Usage in a Pod: + +```yml +env: + - name: USERNAME + valueFrom: + secretKeyRef: + name: example-secret + key: username +``` From c8f86c0da093fe41018f708632c56d8f4bad3dfb Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Sat, 21 Jun 2025 11:02:51 +0200 Subject: [PATCH 93/99] add hl --- technology/applications/Applications.md | 1 + technology/applications/development/hl.md | 75 +++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 technology/applications/development/hl.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 94ea8d9..7b94900 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -312,6 +312,7 @@ rev: 2025-01-30 - [uv](./development/uv.md) - [rust-script](./development/rust-script.md) - [renovatebot](./development/renovate.md) +- [hl](./development/hl.md) ## Media - [yt-dlp](./media/yt-dlp.md) diff --git a/technology/applications/development/hl.md b/technology/applications/development/hl.md new file mode 100644 index 0000000..9ec1abd --- /dev/null +++ b/technology/applications/development/hl.md @@ -0,0 +1,75 @@ +--- +obj: application +repo: https://github.com/pamburus/hl +---- + +# hl +High-performance log viewer and processor that transforms logs in JSON and logfmt formats into a human-readable output. Built with efficiency in mind, it enables quick parsing and analysis of large log files with minimal overhead. + +## Usage +Usage: `hl [OPTIONS] [FILE]...` + +| Option | Environment | Description | +| ----------------------------------- | ------------ | ---------------------------------------------------------------------------------------------------- | +| `--config <FILE>` | `$HL_CONFIG` | Configuration file path | +| `-s`, `--sort` | | Sort messages chronologically | +| `-F`, `--follow` | | Follow input streams and sort messages chronologically during time frame set by `--sync-interval-ms` | +| `--tail <N>` | | Number of last messages to preload in `--follow` mode (default: 10) | +| `--sync-interval-ms <MILLISECONDS>` | | Synchronization interval for live streaming (default: 100) | +| `--paging <WHEN>` | `$HL_PAGING` | Control pager usage (default: auto) [auto, always, never] | +| `-P` | | Alias for `--paging=never`, overrides `--paging` | +| `--help` | | Print help | +| `-V`, `--version` | | Print version | + +### Filtering Options + +| Option | Environment | Description | +| ------------------------- | ----------- | --------------------------------------------------- | +| `-l`, `--level <LEVEL>` | `$HL_LEVEL` | Filter messages by level | +| `--since <TIME>` | | Filter messages by timestamp >= TIME | +| `--until <TIME>` | | Filter messages by timestamp <= TIME | +| `-f`, `--filter <FILTER>` | | Filter by field values, e.g. `k=v`, `k~=v`, `k~~=v` | +| `-q`, `--query <QUERY>` | | Filter using query expressions | + +### Output Options + +| Option | Environment | Description | +| ------------------------------ | ----------------------- | -------------------------------------------------------------------------- | +| `--color [<WHEN>]` | `$HL_COLOR` | Control color output (default: auto) [auto, always, never] | +| `-c` | | Alias for `--color=always`, overrides `--color` | +| `--theme <THEME>` | `$HL_THEME` | Set color theme (default: uni) | +| `-r`, `--raw` | | Output raw source messages | +| `--no-raw` | | Disable raw output, overrides `--raw` | +| `--raw-fields` | | Output raw field values without formatting | +| `-h`, `--hide <KEY>` | | Hide/reveal fields by key (use `!*` to reveal all) | +| `--flatten <WHEN>` | `$HL_FLATTEN` | Whether to flatten objects (default: always) | +| `-t`, `--time-format <FORMAT>` | `$HL_TIME_FORMAT` | Time format (default: `%b %d %T.%3N`) | +| `-Z`, `--time-zone <TZ>` | `$HL_TIME_ZONE` | Set time zone (default: UTC) | +| `-L`, `--local` | | Use local time zone | +| `--no-local` | | Disable local time zone | +| `-e`, `--hide-empty-fields` | `$HL_HIDE_EMPTY_FIELDS` | Hide empty fields | +| `-E`, `--show-empty-fields` | `$HL_SHOW_EMPTY_FIELDS` | Show empty fields, overrides hide option | +| `--input-info <LAYOUTS>` | | Set input info layout (default: auto) [auto, none, minimal, compact, full] | +| `-o`, `--output <FILE>` | | Write output to file | + +### Input Options + +| Option | Environment | Description | +| ------------------------------ | ------------------------- | -------------------------------------------------------------- | +| `--input-format <FORMAT>` | `$HL_INPUT_FORMAT` | Set input format (default: auto) [auto, json, logfmt] | +| `--unix-timestamp-unit <UNIT>` | `$HL_UNIX_TIMESTAMP_UNIT` | Unit for Unix timestamps (default: auto) [auto, s, ms, us, ns] | +| `--allow-prefix` | `$HL_ALLOW_PREFIX` | Allow non-JSON prefixes | +| `--delimiter <DELIMITER>` | | Message delimiter, e.g. [NUL, CR, LF, CRLF, custom string] | + +### Advanced Options + +| Option | Environment | Description | +| ------------------------------ | ---------------------------- | ------------------------------------------------------------------------ | +| `--interrupt-ignore-count <N>` | `$HL_INTERRUPT_IGNORE_COUNT` | Number of Ctrl-C signals to ignore (default: 3) | +| `--buffer-size <SIZE>` | `$HL_BUFFER_SIZE` | Set buffer size (default: "256 KiB") | +| `--max-message-size <SIZE>` | `$HL_MAX_MESSAGE_SIZE` | Max message size (default: "64 MiB") | +| `-C`, `--concurrency <N>` | `$HL_CONCURRENCY` | Number of processing threads | +| `--shell-completions <SHELL>` | | Print shell completion script [bash, elvish, fish, powershell, zsh] | +| `--man-page` | | Print man page | +| `--list-themes[=<TAGS>]` | | Print available themes, optionally filtered [dark, light, 16color, etc.] | +| `--dump-index` | | Print debug index metadata in `--sort` mode | From 4fc56d3efd3d94b37f31a58d18349a9505dd9139 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Mon, 23 Jun 2025 01:37:56 +0200 Subject: [PATCH 94/99] add blackarch --- technology/linux/Arch Linux.md | 4 ++- technology/linux/BlackArch.md | 57 ++++++++++++++++++++++++++++++++ technology/linux/blackarch.avif | Bin 0 -> 204595 bytes 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 technology/linux/BlackArch.md create mode 100644 technology/linux/blackarch.avif diff --git a/technology/linux/Arch Linux.md b/technology/linux/Arch Linux.md index d97ad8c..b229fa3 100644 --- a/technology/linux/Arch Linux.md +++ b/technology/linux/Arch Linux.md @@ -5,7 +5,9 @@ rev: 2024-09-13 --- # Arch Linux -Arch is a very minimal [Linux](Linux.md) Distribution. It features many [packages](https://archlinux.org/packages/) installable with [Pacman](../applications/package%20managers/arch-linux/Pacman.md) and a useful [wiki](https://wiki.archlinux.org/). Additional software support is based on the [AUR](https://aur.archlinux.org/) +Arch is a very minimal [Linux](Linux.md) Distribution. It features many [packages](https://archlinux.org/packages/) installable with [Pacman](../applications/package%20managers/arch-linux/Pacman.md) and a useful [wiki](https://wiki.archlinux.org/). Additional software support is based on the [AUR](https://aur.archlinux.org/). + +There is also a hacker distro called [BlackArch](./BlackArch.md). Installation of Arch Linux is typically done manually following the [Wiki](https://wiki.archlinux.org/title/Installation_guide). Additionally there are install scripts like this one: ```shell diff --git a/technology/linux/BlackArch.md b/technology/linux/BlackArch.md new file mode 100644 index 0000000..b987d02 --- /dev/null +++ b/technology/linux/BlackArch.md @@ -0,0 +1,57 @@ +--- +obj: os +website: https://blackarch.org +--- + +# BlackArch +BlackArch Linux is an Arch Linux-based penetration testing distribution for penetration testers and security researchers. The repository contains 2846 tools. You can install tools individually or in groups. BlackArch Linux is compatible with existing Arch installs. For more information, see the installation instructions. + +![Screenshot](./blackarch.avif) + +## Install +Installation instructions can be found [here](https://blackarch.org/blackarch-install.html). + +### On Arch Linux +BlackArch Linux is compatible with existing/normal Arch installations. It acts as an unofficial user repository. Below you will find instructions on how to install BlackArch in this manner. + +```sh +# Run https://blackarch.org/strap.sh as root and follow the instructions. + +$ curl -O https://blackarch.org/strap.sh +# Verify the SHA1 sum + +$ echo bbf0a0b838aed0ec05fff2d375dd17591cbdf8aa strap.sh | sha1sum -c +# Set execute bit + +$ chmod +x strap.sh +# Run strap.sh + +$ sudo ./strap.sh +# Enable multilib following https://wiki.archlinux.org/index.php/Official_repositories#Enabling_multilib and run: + +$ sudo pacman -Syu +``` + +You may now install tools from the blackarch repository. + +```sh +# To list all of the available tools, run + +$ sudo pacman -Sgg | grep blackarch | cut -d' ' -f2 | sort -u +# To install a category of tools, run + +$ sudo pacman -S blackarch-<category> +# To see the blackarch categories, run + +$ sudo pacman -Sg | grep blackarch +# To search for a specific package, run + +$ pacman -Ss <package_name> +# Note - it maybe be necessary to overwrite certain packages when installing blackarch tools. If +# you experience "failed to commit transaction" errors, use the --needed and --overwrite switches +# For example: + +$ sudo pacman -Syyu --needed --overwrite='*' <wanted-package> +``` + +The complete tool list of the BlackArch Linux repository can be found [here](https://blackarch.org/tools.html). diff --git a/technology/linux/blackarch.avif b/technology/linux/blackarch.avif new file mode 100644 index 0000000000000000000000000000000000000000..40a950c7225dbe15a1bfb93748a2ee8afdf4ad64 GIT binary patch literal 204595 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 eH+JgV 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 literal 0 HcmV?d00001 From a422d93c7b8a1b5dfd812fe5677f7789592dda82 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Mon, 23 Jun 2025 01:44:06 +0200 Subject: [PATCH 95/99] add ab-av1 --- technology/applications/Applications.md | 1 + technology/applications/media/ab-av1.md | 75 +++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 technology/applications/media/ab-av1.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 7b94900..7d552e6 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -325,6 +325,7 @@ rev: 2025-01-30 - [artem](./media/artem.md) - [auto-palette-cli](./media/auto-palette-cli.md) - [metadata](./media/metadata-cli.md) +- [ab-av1](./media/ab-av1.md) ## Network - [rclone](./network/rclone.md) diff --git a/technology/applications/media/ab-av1.md b/technology/applications/media/ab-av1.md new file mode 100644 index 0000000..238295c --- /dev/null +++ b/technology/applications/media/ab-av1.md @@ -0,0 +1,75 @@ +--- +obj: application +repo: https://github.com/alexheretic/ab-av1 +--- + +# ab-av1 +AV1 video encoding tool with fast VMAF sampling & automatic encoder crf calculation. Uses [`ffmpeg`](./ffmpeg.md), `svt-av1` & `vmaf`. + +## Usage +### Command: `auto-encode` +Automatically determine the best crf to deliver the `--min-vmaf` and use it to encode a video or image. + +Two phases: +- `crf-search` to determine the best `--crf` value +- `ffmpeg` to encode using the settings + +```sh +ab-av1 auto-encode [OPTIONS] -i <INPUT> --preset <PRESET> --min-vmaf <MIN_VMAF> +``` + +### Command: `crf-search` +Interpolated binary search using sample-encode to find the best crf value delivering `--min-vmaf` & `--max-encoded-percent`. + +Outputs: +- Best crf value +- Mean sample VMAF score +- Predicted full encode size +- Predicted full encode time + +```sh +ab-av1 crf-search [OPTIONS] -i <INPUT> --preset <PRESET> --min-vmaf <MIN_VMAF> +``` + +Notable options +- `--min-xpsnr` <MIN_XPSNR> may be used as an alternative to VMAF. + +### Command: `sample-encode` +Encode short video samples of an input using provided crf & preset. This is much quicker than full encode/vmaf run. + +Outputs: +- Mean sample VMAF score +- Predicted full encode size +- Predicted full encode time + +```sh +ab-av1 sample-encode [OPTIONS] -i <INPUT> --crf <CRF> --preset <PRESET> +``` + +Notable options +- `--xpsnr` specifies calculation of XPSNR score instead of VMAF. + +### Command: `encode` +Invoke `ffmpeg` to encode a video or image. + +```sh +ab-av1 encode [OPTIONS] -i <INPUT> --crf <CRF> --preset <PRESET> +``` + +### Command: `vmaf` +Full VMAF score calculation, distorted file vs reference file. Works with videos and images. + +- Auto sets model version (4k or 1k) according to resolution. +- Auto sets n_threads to system threads. +- Auto upscales lower resolution videos to the model. + +```sh +ab-av1 vmaf --reference <REFERENCE> --distorted <DISTORTED> +``` + +### Command: `xpsnr` +Full XPSNR score calculation, distorted file vs reference file. Works with videos and images. + +```sh +ab-av1 xpsnr --reference <REFERENCE> --distorted <DISTORTED> +``` From 87702f58dab125be0c64bc5e372d722a7c33aecd Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Tue, 24 Jun 2025 23:13:23 +0200 Subject: [PATCH 96/99] add gitql --- technology/applications/Applications.md | 1 + technology/dev/gitql.md | 48 +++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 technology/dev/gitql.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 7d552e6..641a5c4 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -297,6 +297,7 @@ rev: 2025-01-30 - [tokei](./cli/tokei.md) - [gum](./cli/gum.md) - [git](../dev/Git.md) +- [gitql](../dev/gitql.md) - [Ansible](../tools/Ansible/Ansible.md) - [Docker](../tools/Docker.md) - [Podman](../tools/Podman.md) diff --git a/technology/dev/gitql.md b/technology/dev/gitql.md new file mode 100644 index 0000000..3ffa404 --- /dev/null +++ b/technology/dev/gitql.md @@ -0,0 +1,48 @@ +--- +obj: application +website: https://amrdeveloper.github.io/GQL/ +repo: https://github.com/amrdeveloper/GQL +--- + +# GitQL +GQL is a query language with a syntax very similar to SQL with a tiny engine to perform queries on `.git` files instance of database files, the engine executes the query on the fly without the need to create database files or convert `.git` files into any other format, note that all Keywords in GQL are case-insensitive similar to SQL. + +## Examples + +```sql +SELECT 1 +SELECT 1 + 2 +SELECT LEN("Git Query Language") +SELECT "One" IN ("One", "Two", "Three") +SELECT "Git Query Language" LIKE "%Query%" +SELECT INTERVAL '1 year 2 mons 3 days 04:05:06.789' + +SET @arr = [1, 2, 3]; +SELECT [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; +SELECT @arr[1], @arr[2], @arr[3], ARRAY_LENGTH(@arr); +SELECT @arr[1:2], @arr[2:], @arr[:2]; + +SELECT DISTINCT title AS tt FROM commits +SELECT author_name, COUNT(author_name) AS commit_num FROM commits GROUP BY author_name, author_email ORDER BY commit_num DESC LIMIT 10 +SELECT commit_count FROM branches WHERE commit_count BETWEEN 0 AND 10 + +SELECT * FROM refs WHERE type = "branch" +SELECT * FROM refs ORDER BY type + +SELECT * FROM commits +SELECT author_name, author_email FROM commits +SELECT author_name, author_email FROM commits ORDER BY author_name DESC, author_email ASC +SELECT author_name, author_email FROM commits WHERE author_email LIKE "%gmail%" ORDER BY author_name +SELECT * FROM commits WHERE LOWER(author_name) = "amrdeveloper" +SELECT author_name FROM commits GROUP By author_name +SELECT author_name FROM commits GROUP By author_name HAVING author_name = "AmrDeveloper" + +SELECT * FROM branches +SELECT * FROM branches WHERE is_head = true +SELECT name, LEN(name) FROM branches + +SELECT * FROM tags +SELECT * FROM tags OFFSET 1 LIMIT 1 + +SELECT path, count() AS changes_count, SUM(insertions) AS additions, SUM(removals) AS removes FROM diffs_changes GROUP BY path ORDER BY changes_count DESC +``` From 95750fa75574bb08d31bc917d1a00fb721b9f861 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Wed, 25 Jun 2025 05:03:16 +0200 Subject: [PATCH 97/99] add limbo --- technology/applications/Applications.md | 1 + technology/applications/development/limbo.md | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 technology/applications/development/limbo.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 641a5c4..693461f 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -306,6 +306,7 @@ rev: 2025-01-30 - [sops](../tools/sops.md) - [serie](./cli/serie.md) - [usql](./cli/usql.md) +- [limbo](./development/limbo.md) - [kondo](./cli/kondo.md) - [licensit](./development/licensit.md) - [onefetch](./development/onefetch.md) diff --git a/technology/applications/development/limbo.md b/technology/applications/development/limbo.md new file mode 100644 index 0000000..6c6664c --- /dev/null +++ b/technology/applications/development/limbo.md @@ -0,0 +1,10 @@ +--- +obj: application +repo: https://github.com/tursodatabase/limbo +--- + +# Limbo +Limbo is a work-in-progress, in-process OLTP database engine library written in Rust that has: +- SQLite compatibility for SQL dialect, file formats, and the C API +- Language bindings for JavaScript/WebAssembly, Rust, Go, Python, and Java +- Asynchronous I/O support on Linux with io_uring From d888ed74deacfabb32aed86265f442eb198d847a Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Wed, 25 Jun 2025 06:00:46 +0200 Subject: [PATCH 98/99] add fleetdm + osquery --- technology/applications/Applications.md | 2 ++ technology/applications/utilities/osquery.md | 14 ++++++++++++++ technology/applications/web/FleetDM.md | 9 +++++++++ 3 files changed, 25 insertions(+) create mode 100644 technology/applications/utilities/osquery.md create mode 100644 technology/applications/web/FleetDM.md diff --git a/technology/applications/Applications.md b/technology/applications/Applications.md index 693461f..066a3bb 100644 --- a/technology/applications/Applications.md +++ b/technology/applications/Applications.md @@ -184,6 +184,7 @@ rev: 2025-01-30 - [SFTPGo](./web/sftpgo.md) - [Lemmy](./web/lemmy.md) - [Stump](./web/stump.md) +- [FleetDM](./web/FleetDM.md) # CLI ## Terminal @@ -288,6 +289,7 @@ rev: 2025-01-30 - [retry-cli](./utilities/retry-cli.md) - [systeroid](./utilities/systeroid.md) - [distrobox](./utilities/distrobox.md) +- [osquery](./utilities/osquery.md) ## Development - [act](./development/act.md) diff --git a/technology/applications/utilities/osquery.md b/technology/applications/utilities/osquery.md new file mode 100644 index 0000000..5dcb258 --- /dev/null +++ b/technology/applications/utilities/osquery.md @@ -0,0 +1,14 @@ +--- +obj: application +website: https://www.osquery.io +repo: https://github.com/osquery/osquery +--- + +# osquery + +[osquery](https://osquery.io/) is an open-source endpoint instrumentation framework. It exposes an operating system as a high-performance relational database, allowing you to write SQL queries to explore system state and activity in real-time. See [schema](https://osquery.io/schema/5.17.0/). + +## Usage +Usage: `osqueryi [SQL]` + +Example Statement: `SELECT name, path, pid FROM processes WHERE on_disk = 0;` diff --git a/technology/applications/web/FleetDM.md b/technology/applications/web/FleetDM.md new file mode 100644 index 0000000..45b812a --- /dev/null +++ b/technology/applications/web/FleetDM.md @@ -0,0 +1,9 @@ +--- +obj: application +website: https://fleetdm.com +repo: https://github.com/fleetdm/fleet +--- + +# FleetDM + +[FleetDM](https://fleetdm.com/) is an open-source device management platform built to help teams query, monitor, and secure their entire infrastructure using [osquery](../utilities/osquery.md). It provides a scalable and centralized way to collect real-time information from thousands of laptops, desktops, and servers across a fleet. From 38e61193f593d3120b42297057f980e2079e67d9 Mon Sep 17 00:00:00 2001 From: JMARyA <jmarya@hydrar.de> Date: Thu, 26 Jun 2025 08:17:03 +0200 Subject: [PATCH 99/99] update systemd --- .../applications/network/NetworkManager.md | 6 +- technology/linux/fwupd.md | 34 ++++- technology/linux/smartctl.md | 9 +- technology/linux/systemd/Systemd.md | 5 + technology/linux/systemd/hostnamectl.md | 14 +- technology/linux/systemd/journalctl.md | 74 +++++++++- technology/linux/systemd/localectl.md | 21 ++- technology/linux/systemd/loginctl.md | 36 ++++- technology/linux/systemd/networkctl.md | 26 +++- technology/linux/systemd/systemd-analyze.md | 60 ++++++++- technology/linux/systemd/systemd-ask-pass.md | 6 - .../linux/systemd/systemd-ask-password.md | 10 ++ technology/linux/systemd/systemd-inhibit.md | 4 +- technology/linux/systemd/systemd-resolve.md | 6 - technology/linux/systemd/systemd-resolved.md | 41 ++++++ technology/linux/systemd/systemd-timesyncd.md | 25 +++- technology/linux/systemd/userdbctl.md | 15 ++- technology/linux/udev.md | 24 +++- technology/linux/udisks.md | 127 +++++++++++++++++- 19 files changed, 511 insertions(+), 32 deletions(-) delete mode 100644 technology/linux/systemd/systemd-ask-pass.md create mode 100644 technology/linux/systemd/systemd-ask-password.md delete mode 100644 technology/linux/systemd/systemd-resolve.md create mode 100644 technology/linux/systemd/systemd-resolved.md diff --git a/technology/applications/network/NetworkManager.md b/technology/applications/network/NetworkManager.md index 7e20ae4..dffeb87 100644 --- a/technology/applications/network/NetworkManager.md +++ b/technology/applications/network/NetworkManager.md @@ -1,16 +1,16 @@ --- obj: application +website: https://networkmanager.dev +repo: https://gitlab.freedesktop.org/NetworkManager/NetworkManager --- -#refactor - # NetworkManager [NetworkManager](https://networkmanager.dev/) is a program for providing detection and configuration for systems to automatically connect to networks. NetworkManager's functionality can be useful for both wireless and wired networks. For wireless networks, NetworkManager prefers known wireless networks and has the ability to switch to the most reliable network. NetworkManager-aware applications can switch from online and offline mode. NetworkManager also prefers wired connections over wireless ones, has support for modem connections and certain types of VPN. NetworkManager was originally developed by Red Hat and now is hosted by the GNOME project. After installation, you should start/enable `NetworkManager.service`. Once the NetworkManager daemon is started, it will automatically connect to any available "system connections" that have already been configured. Any "user connections" or unconfigured connections will need _nmcli_ or an applet to configure and connect. ## Usage -NetworkManager comes with nmcli and nmtui. +NetworkManager comes with `nmcli` and `nmtui`. ### nmcli examples List nearby Wi-Fi networks: diff --git a/technology/linux/fwupd.md b/technology/linux/fwupd.md index 76891b3..f54e281 100644 --- a/technology/linux/fwupd.md +++ b/technology/linux/fwupd.md @@ -6,4 +6,36 @@ repo: https://github.com/fwupd/fwupd --- # fwupd -#wip + +fwupd is a simple daemon to allow session software to update device firmware on your local machine. It's designed for desktops, but also usable on phones and headless servers. + +## Usage +To display all devices detected by fwupd: +``` +$ fwupdmgr get-devices +``` + +> *Note*: Listed devices may not be updatable through fwupd (e.g. Intel integrated graphics). Alternative vendor solutions may be provided instead. + +To download the latest metadata from the Linux Vendor firmware Service (LVFS): +``` +$ fwupdmgr refresh +``` + +> *Note*: This can be done automatically by enabling `fwupd-refresh.timer`. + +To list updates available for any devices on the system: +``` +$ fwupdmgr get-updates +``` + +To install updates: +``` +$ fwupdmgr update +``` + +> *Note*: +> - Updates that can be applied live will be done immediately. +> - Updates that run at bootup will be staged for the next reboot. +> - The root user may be required to perform certain device updates. + diff --git a/technology/linux/smartctl.md b/technology/linux/smartctl.md index e0c1b65..6694b0f 100644 --- a/technology/linux/smartctl.md +++ b/technology/linux/smartctl.md @@ -1,6 +1,13 @@ --- obj: application +arch-wiki: https://wiki.archlinux.org/title/S.M.A.R.T. +website: https://www.smartmontools.org --- # smartctl -#wip + +S.M.A.R.T. (Self-Monitoring, Analysis, and Reporting Technology) is a supplementary component built into many modern storage devices through which devices monitor, store, and analyze the health of their operation. Statistics are collected (temperature, number of reallocated sectors, seek errors...) which software can use to measure the health of a device, predict possible device failure, and provide notifications on unsafe values. + +## Usage + +Show all smart information: `smartctl -a /device` diff --git a/technology/linux/systemd/Systemd.md b/technology/linux/systemd/Systemd.md index c5251a8..f2f85aa 100644 --- a/technology/linux/systemd/Systemd.md +++ b/technology/linux/systemd/Systemd.md @@ -92,6 +92,11 @@ Stored in: - `/etc/systemd/system/`: units installed by the system administrator - `~/.config/systemd/user/`: units used by local users +### User Units +Units can run under a user context. These are under the users home directory like `~/.config/systemd/user/` and can be used with `systemctl --user`. + +To run user units even the user is not logged in, enable: `loginctl enable-linger <user>`. + ### Service types There are several different start-up types to consider when writing a custom service file. This is set with the `Type=` parameter in the `[Service]` section: diff --git a/technology/linux/systemd/hostnamectl.md b/technology/linux/systemd/hostnamectl.md index 56bfaa0..fa63e2a 100644 --- a/technology/linux/systemd/hostnamectl.md +++ b/technology/linux/systemd/hostnamectl.md @@ -3,4 +3,16 @@ obj: application --- # hostnamectl -#wip +Query or change system hostname. + +Usage: `hostnamectl [OPTIONS...] COMMAND ...` + +Commands: +``` + status Show current hostname settings + hostname [NAME] Get/set system hostname + icon-name [NAME] Get/set icon name for host + chassis [NAME] Get/set chassis type for host + deployment [NAME] Get/set deployment environment for host + location [NAME] Get/set location for host +``` diff --git a/technology/linux/systemd/journalctl.md b/technology/linux/systemd/journalctl.md index 9e119a7..5a8da54 100644 --- a/technology/linux/systemd/journalctl.md +++ b/technology/linux/systemd/journalctl.md @@ -1,6 +1,78 @@ --- obj: application +arch-wiki: https://wiki.archlinux.org/title/Systemd/Journal --- # journalctl -#wip + +systemd has its own logging system called the journal; running a separate logging daemon is not required. To read the log, use `journalctl`. + +## Usage +Show all messages matching `PATTERN`: +``` +# journalctl --grep=PATTERN +``` + +Show all messages from this boot: +``` +# journalctl -b +``` + +However, often one is interested in messages not from the current, but from the previous boot (e.g. if an unrecoverable system crash happened). This is possible through optional offset parameter of the `-b` flag: `journalctl -b -0` shows messages from the current boot, `journalctl -b -1` from the previous boot, `journalctl -b -2` from the second previous and so on – you can see the list of boots with their numbers by using `journalctl --list-boots`. + +Include explanations of log messages from the message catalog where available: +``` +# journalctl -x +``` + +Show all messages from date (and optional time): +``` +# journalctl --since="2012-10-30 18:17:16" +``` + +Show all messages since 20 minutes ago: +``` +# journalctl --since "20 min ago" +``` + +Follow new messages: +``` +# journalctl -f +``` + +Show all messages by a specific executable: +``` +# journalctl /usr/lib/systemd/systemd +``` + +Show all messages by a specific identifier: +``` +# journalctl -t sudo +``` + +Show all messages by a specific process: +``` +# journalctl _PID=1 +``` + +Show all messages by a specific unit: +``` +# journalctl -u man-db.service +``` + +Show all messages from user services by a specific unit: +``` +$ journalctl --user -u dbus +``` + +Show kernel ring buffer: +``` +# journalctl -k +``` + +Show only error, critical and alert priority messages: +``` +# journalctl -p err..alert +``` + +You can use numeric log level too, like `journalctl -p 3..1`. If single number/log level is used, `journalctl -p 3`, then all higher priority log levels are also included (i.e. 0 to 3 in this case). diff --git a/technology/linux/systemd/localectl.md b/technology/linux/systemd/localectl.md index 77ca526..3311cc9 100644 --- a/technology/linux/systemd/localectl.md +++ b/technology/linux/systemd/localectl.md @@ -3,5 +3,22 @@ obj: application --- # localectl -#wip -https://man.archlinux.org/man/localectl.1 +Query or change system locale and keyboard settings. + +Usage: `localectl [OPTIONS...] COMMAND ...` + +Commands: +``` + status Show current locale settings + set-locale LOCALE... Set system locale + list-locales Show known locales + set-keymap MAP [MAP] Set console and X11 keyboard mappings + list-keymaps Show known virtual console keyboard mappings + set-x11-keymap LAYOUT [MODEL [VARIANT [OPTIONS]]] + Set X11 and console keyboard mappings + list-x11-keymap-models Show known X11 keyboard mapping models + list-x11-keymap-layouts Show known X11 keyboard mapping layouts + list-x11-keymap-variants [LAYOUT] + Show known X11 keyboard mapping variants + list-x11-keymap-options Show known X11 keyboard mapping options +``` diff --git a/technology/linux/systemd/loginctl.md b/technology/linux/systemd/loginctl.md index da735c9..4ffc05c 100644 --- a/technology/linux/systemd/loginctl.md +++ b/technology/linux/systemd/loginctl.md @@ -3,4 +3,38 @@ obj: application --- # loginctl -#wip +Send control commands to or query the login manager. + +Usage: `loginctl [OPTIONS...] COMMAND ...` + + +``` +Session Commands: + list-sessions List sessions + session-status [ID...] Show session status + show-session [ID...] Show properties of sessions or the manager + activate [ID] Activate a session + lock-session [ID...] Screen lock one or more sessions + unlock-session [ID...] Screen unlock one or more sessions + lock-sessions Screen lock all current sessions + unlock-sessions Screen unlock all current sessions + terminate-session ID... Terminate one or more sessions + kill-session ID... Send signal to processes of a session + +User Commands: + list-users List users + user-status [USER...] Show user status + show-user [USER...] Show properties of users or the manager + enable-linger [USER...] Enable linger state of one or more users + disable-linger [USER...] Disable linger state of one or more users + terminate-user USER... Terminate all sessions of one or more users + kill-user USER... Send signal to processes of a user + +Seat Commands: + list-seats List seats + seat-status [NAME...] Show seat status + show-seat [NAME...] Show properties of seats or the manager + attach NAME DEVICE... Attach one or more devices to a seat + flush-devices Flush all device associations + terminate-seat NAME... Terminate all sessions on one or more seats +``` diff --git a/technology/linux/systemd/networkctl.md b/technology/linux/systemd/networkctl.md index 0ddbe1f..20c2ab0 100644 --- a/technology/linux/systemd/networkctl.md +++ b/technology/linux/systemd/networkctl.md @@ -3,4 +3,28 @@ obj: application --- # networkctl -#wip +Query and control the networking subsystem. +This controls the networking via `systemd-networkd`. + +Usage: `networkctl [OPTIONS...] COMMAND` + +Commands: +``` + list [PATTERN...] List links + status [PATTERN...] Show link status + lldp [PATTERN...] Show LLDP neighbors + label Show current address label entries in the kernel + delete DEVICES... Delete virtual netdevs + up DEVICES... Bring devices up + down DEVICES... Bring devices down + renew DEVICES... Renew dynamic configurations + forcerenew DEVICES... Trigger DHCP reconfiguration of all connected clients + reconfigure DEVICES... Reconfigure interfaces + reload Reload .network and .netdev files + edit FILES|DEVICES... Edit network configuration files + cat [FILES|DEVICES...] Show network configuration files + mask FILES... Mask network configuration files + unmask FILES... Unmask network configuration files + persistent-storage BOOL + Notify systemd-networkd if persistent storage is ready +``` diff --git a/technology/linux/systemd/systemd-analyze.md b/technology/linux/systemd/systemd-analyze.md index 918ccba..4ccf76e 100644 --- a/technology/linux/systemd/systemd-analyze.md +++ b/technology/linux/systemd/systemd-analyze.md @@ -3,4 +3,62 @@ obj: application --- # systemd-analyze -#wip + +Profile systemd, show unit dependencies, check unit files. + +Usage: `systemd-analyze [OPTIONS...] COMMAND ...` + +``` +Boot Analysis: + [time] Print time required to boot the machine + blame Print list of running units ordered by + time to init + critical-chain [UNIT...] Print a tree of the time critical chain + of units + +Dependency Analysis: + plot Output SVG graphic showing service + initialization + dot [UNIT...] Output dependency graph in dot(1) format + dump [PATTERN...] Output state serialization of service + manager + +Configuration Files and Search Paths: + cat-config NAME|PATH... Show configuration file and drop-ins + unit-files List files and symlinks for units + unit-paths List load directories for units + +Enumerate OS Concepts: + exit-status [STATUS...] List exit status definitions + capability [CAP...] List capability definitions + syscall-filter [NAME...] List syscalls in seccomp filters + filesystems [NAME...] List known filesystems + architectures [NAME...] List known architectures + smbios11 List strings passed via SMBIOS Type #11 + +Expression Evaluation: + condition CONDITION... Evaluate conditions and asserts + compare-versions VERSION1 [OP] VERSION2 + Compare two version strings + image-policy POLICY... Analyze image policy string + +Clock & Time: + calendar SPEC... Validate repetitive calendar time + events + timestamp TIMESTAMP... Validate a timestamp + timespan SPAN... Validate a time span + +Unit & Service Analysis: + verify FILE... Check unit files for correctness + security [UNIT...] Analyze security of unit + fdstore SERVICE... Show file descriptor store contents of service + malloc [D-BUS SERVICE...] Dump malloc stats of a D-Bus service + +Executable Analysis: + inspect-elf FILE... Parse and print ELF package metadata + +TPM Operations: + has-tpm2 Report whether TPM2 support is available + pcrs [PCR...] Show TPM2 PCRs and their names + srk [>FILE] Write TPM2 SRK (to FILE) +``` diff --git a/technology/linux/systemd/systemd-ask-pass.md b/technology/linux/systemd/systemd-ask-pass.md deleted file mode 100644 index c321193..0000000 --- a/technology/linux/systemd/systemd-ask-pass.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -obj: application ---- - -# systemd-ask-pass -#wip diff --git a/technology/linux/systemd/systemd-ask-password.md b/technology/linux/systemd/systemd-ask-password.md new file mode 100644 index 0000000..a68b7e3 --- /dev/null +++ b/technology/linux/systemd/systemd-ask-password.md @@ -0,0 +1,10 @@ +--- +obj: application +--- + +# systemd-ask-password + +Query the user for a passphrase, via the TTY or a UI agent. + +Usage: `systemd-ask-password [OPTIONS...] MESSAGE` + diff --git a/technology/linux/systemd/systemd-inhibit.md b/technology/linux/systemd/systemd-inhibit.md index d728255..3c3b4b4 100644 --- a/technology/linux/systemd/systemd-inhibit.md +++ b/technology/linux/systemd/systemd-inhibit.md @@ -3,4 +3,6 @@ obj: application --- # systemd-inhibit -#wip +Execute a process while inhibiting shutdown/sleep/idle. + +Usage: `systemd-inhibit [OPTIONS...] COMMAND ...` diff --git a/technology/linux/systemd/systemd-resolve.md b/technology/linux/systemd/systemd-resolve.md deleted file mode 100644 index 5896281..0000000 --- a/technology/linux/systemd/systemd-resolve.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -obj: application ---- - -# systemd-resolve -#wip diff --git a/technology/linux/systemd/systemd-resolved.md b/technology/linux/systemd/systemd-resolved.md new file mode 100644 index 0000000..b4da2d9 --- /dev/null +++ b/technology/linux/systemd/systemd-resolved.md @@ -0,0 +1,41 @@ +--- +obj: application +arch-wiki: https://wiki.archlinux.org/title/Systemd-resolved +--- + +# systemd-resolved + +systemd-resolved is a systemd service that provides network name resolution to local applications via a D-Bus interface, the `resolve` NSS service, and a local DNS stub listener on `127.0.0.53`. + +## resolvectl + +Send control commands to the network name resolution manager, or +resolve domain names, IPv4 and IPv6 addresses, DNS records, and services. + +Usage: `resolvectl [OPTIONS...] COMMAND ...` + +Commands: +``` + query HOSTNAME|ADDRESS... Resolve domain names, IPv4 and IPv6 addresses + service [[NAME] TYPE] DOMAIN Resolve service (SRV) + openpgp EMAIL@DOMAIN... Query OpenPGP public key + tlsa DOMAIN[:PORT]... Query TLS public key + status [LINK...] Show link and server status + statistics Show resolver statistics + reset-statistics Reset resolver statistics + flush-caches Flush all local DNS caches + reset-server-features Forget learnt DNS server feature levels + monitor Monitor DNS queries + show-cache Show cache contents + show-server-state Show servers state + dns [LINK [SERVER...]] Get/set per-interface DNS server address + domain [LINK [DOMAIN...]] Get/set per-interface search domain + default-route [LINK [BOOL]] Get/set per-interface default route flag + llmnr [LINK [MODE]] Get/set per-interface LLMNR mode + mdns [LINK [MODE]] Get/set per-interface MulticastDNS mode + dnsovertls [LINK [MODE]] Get/set per-interface DNS-over-TLS mode + dnssec [LINK [MODE]] Get/set per-interface DNSSEC mode + nta [LINK [DOMAIN...]] Get/set per-interface DNSSEC NTA + revert LINK Revert per-interface configuration + log-level [LEVEL] Get/set logging threshold for systemd-resolved +``` diff --git a/technology/linux/systemd/systemd-timesyncd.md b/technology/linux/systemd/systemd-timesyncd.md index 1578234..6333cdc 100644 --- a/technology/linux/systemd/systemd-timesyncd.md +++ b/technology/linux/systemd/systemd-timesyncd.md @@ -4,6 +4,27 @@ arch-wiki: https://wiki.archlinux.org/title/Systemd-timesyncd --- # systemd-timesyncd -#wip +systemd-timesyncd is a daemon that has been added for synchronizing the system clock across the network. -timedatectl +## Usage +Query or change system time and date settings. + +Usage: `timedatectl [OPTIONS...] COMMAND ...` + +Commands: +``` + status Show current time settings + show Show properties of systemd-timedated + set-time TIME Set system time + set-timezone ZONE Set system time zone + list-timezones Show known time zones + set-local-rtc BOOL Control whether RTC is in local time + set-ntp BOOL Enable or disable network time synchronization + +systemd-timesyncd Commands: + timesync-status Show status of systemd-timesyncd + show-timesync Show properties of systemd-timesyncd + ntp-servers INTERFACE SERVER… + Set the interface specific NTP servers + revert INTERFACE Revert the interface specific NTP servers +``` diff --git a/technology/linux/systemd/userdbctl.md b/technology/linux/systemd/userdbctl.md index 90bbd1e..e64034b 100644 --- a/technology/linux/systemd/userdbctl.md +++ b/technology/linux/systemd/userdbctl.md @@ -3,4 +3,17 @@ obj: application --- # userdbctl -#wip + +Show user and group information. + +Usage: `userdbctl [OPTIONS...] COMMAND ...` + +Commands: +``` + user [USER…] Inspect user + group [GROUP…] Inspect group + users-in-group [GROUP…] Show users that are members of specified groups + groups-of-user [USER…] Show groups the specified users are members of + services Show enabled database services + ssh-authorized-keys USER Show SSH authorized keys for user +``` diff --git a/technology/linux/udev.md b/technology/linux/udev.md index 0fb4f83..9b1ed59 100644 --- a/technology/linux/udev.md +++ b/technology/linux/udev.md @@ -4,6 +4,24 @@ arch-wiki: https://wiki.archlinux.org/title/Udev --- # udev -#wip -udev -udevadm + +udev is a userspace system that enables the operating system administrator to register userspace handlers for events. The events received by udev's daemon are mainly generated by the (Linux) kernel in response to physical events relating to peripheral devices. As such, udev's main purpose is to act upon peripheral detection and hot-plugging, including actions that return control to the kernel, e.g., loading kernel modules or device firmware. Another component of this detection is adjusting the permissions of the device to be accessible to non-root users and groups. + +## Usage +Send control commands or test the device manager. + +Usage: `udevadm [--help] [--version] [--debug] COMMAND [COMMAND OPTIONS]` + +Commands: +``` + info Query sysfs or the udev database + trigger Request events from the kernel + settle Wait for pending udev events + control Control the udev daemon + monitor Listen to kernel and udev events + test Test an event run + test-builtin Test a built-in command + verify Verify udev rules files + wait Wait for device or device symlink + lock Lock a block device +``` diff --git a/technology/linux/udisks.md b/technology/linux/udisks.md index fb4e585..429671d 100644 --- a/technology/linux/udisks.md +++ b/technology/linux/udisks.md @@ -6,4 +6,129 @@ repo: https://github.com/storaged-project/udisks --- # udisks -#wip + +udisks provides a daemon `udisksd`, that implements D-Bus interfaces used to query and manipulate storage devices, and a command-line tool `udisksctl`, used to query and use the daemon. + +## Configuration +### Permissions +Actions a user can perform using udisks are restricted with `polkit`. If the user session is not activated or present (for example, when controlling udisks from a systemd/User service), adjust `polkit` rules accordingly. + +See https://github.com/coldfix/udiskie/wiki/Permissions for common udisks permissions for the `storage` group. + +### Default mount options +It is possible to define default mount options in `/etc/udisks2/mount_options.conf`. Create the file if it does not already exist. The built-in defaults and some examples can be seen in `/etc/udisks2/mount_options.conf.example`. + +The options can target specific filesystem types. For example, mount btrfs filesystems with zstd compression enabled: +``` +# /etc/udisks2/mount_options.conf +[defaults] +btrfs_defaults=compress=zstd +``` + +> *Note*: Lines override the corresponding built-in defaults. Make sure not to accidentally remove mount options this way. + +## Usage +### Information + +Show information about an object. + +Usage: `udisksctl info [OPTION …]` + +| Option | Description | +| -------------------- | ------------------------------------- | +| `-p, --object-path` | Object to get information about | +| `-b, --block-device` | Block device to get information about | +| `-d, --drive` | Drive to get information about | + +To show info on all elements: `udisksctl dump` + +For a high-level status: `udisksctl status` + +To monitor for changes: `udisksctl monitor` + +### Mounting + +Mount a filesystem. + +Usage: `udisksctl mount [OPTION …]` + +| Option | Description | +| ----------------------- | -------------------------------------- | +| `-p, --object-path` | Object to get information about | +| `-b, --block-device` | Block device to get information about | +| `-t, --filesystem-type` | Filesystem type to use | +| `-o, --options` | Mount options | +| `--no-user-interaction` | Do not authenticate the user if needed | + +Unmount a filesystem. + +Usage: `udisksctl unmount [OPTION …]` + +| Option | Description | +| ----------------------- | -------------------------------------- | +| `-p, --object-path` | Object to get information about | +| `-b, --block-device` | Block device to get information about | +| `-f, --force` | Force/lazy unmount | +| `--no-user-interaction` | Do not authenticate the user if needed | + +### Encryption + +Unlock an encrypted device. + +Usage: `udisksctl unlock [OPTION …]` + +| Option | Description | +| ----------------------- | -------------------------------------- | +| `-p, --object-path` | Object to get information about | +| `-b, --block-device` | Block device to get information about | +| `--no-user-interaction` | Do not authenticate the user if needed | +| `--key-file` | Keyfile for unlocking | +| `--read-only` | Unlock the device as read-only | + +Lock an encrypted device. + +Usage: `udisksctl lock [OPTION …]` + +| Option | Description | +| ----------------------- | -------------------------------------- | +| `-p, --object-path` | Object to get information about | +| `-b, --block-device` | Block device to get information about | +| `--no-user-interaction` | Do not authenticate the user if needed | + +### Loop Devices + +Set up a loop device. + +Usage: `udisksctl loop-setup [OPTION …]` + + +| Option | Description | +| ----------------------- | ------------------------------------------ | +| `-f, --file` | File to set-up a loop device for | +| `-r, --read-only` | Setup read-only device | +| `-o, --offset` | Start at `<num>` bytes into file | +| `-s, --size` | Limit size to `<num>` bytes | +| `--no-partition-scan` | Do not scan the loop device for partitions | +| `--no-user-interaction` | Do not authenticate the user if needed | + +Delete a loop device. + +Usage: `udisksctl loop-delete [OPTION …]` + +| Option | Description | +| ----------------------- | -------------------------------------- | +| `-p, --object-path` | Object to get information about | +| `-b, --block-device` | Block device to get information about | +| `--no-user-interaction` | Do not authenticate the user if needed | + +### Power Off + +Safely power off a drive. + +Usage: `udisksctl power-off [OPTION …]` + +| Option | Description | +| ----------------------- | -------------------------------------- | +| `-p, --object-path` | Object to get information about | +| `-b, --block-device` | Block device to get information about | +| `--no-user-interaction` | Do not authenticate the user if needed |