Compare commits
@@ -1,16 +1,13 @@
|
||||
name: Bob the Builder
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
types:
|
||||
- closed
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: ${{github.ref_name == 'main' && github.event_name == 'push'}} || github.event_name == 'workflow_dispatch'
|
||||
name: Build ${{ matrix.platform }} ${{ matrix.variant }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
@@ -76,14 +73,20 @@ jobs:
|
||||
name: Upload Latest Build
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- uses: actions/download-artifact@v3
|
||||
- uses: pyTooling/Actions/releaser@main
|
||||
- uses: ncipollo/release-action@v1
|
||||
with:
|
||||
tag: latest
|
||||
rm: true
|
||||
allowUpdates: true
|
||||
omitName: true
|
||||
omitBody: true
|
||||
omitBodyDuringUpdate: true
|
||||
prerelease: true
|
||||
tag: "latest"
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
files: artifact/*
|
||||
artifacts: "artifact/*"
|
||||
- name: Summary
|
||||
run: |
|
||||
cat <<EOF >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
name: Coverity Scan
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
PROJECT_NAME: Infix
|
||||
CONTACT_EMAIL: troglobit@gmail.com
|
||||
|
||||
jobs:
|
||||
coverity:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Fetch latest Coverity Scan MD5
|
||||
id: var
|
||||
env:
|
||||
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
|
||||
run: |
|
||||
wget -q https://scan.coverity.com/download/cxx/linux64 \
|
||||
--post-data "token=$TOKEN&project=${PROJECT_NAME}&md5=1" \
|
||||
-O coverity-latest.tar.gz.md5
|
||||
echo "md5=$(cat coverity-latest.tar.gz.md5)" | tee -a $GITHUB_OUTPUT
|
||||
- uses: actions/cache@v3
|
||||
id: cache
|
||||
with:
|
||||
path: coverity-latest.tar.gz
|
||||
key: ${{ runner.os }}-coverity-${{ steps.var.outputs.md5 }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-coverity-${{ steps.var.outputs.md5 }}
|
||||
${{ runner.os }}-coverity-
|
||||
${{ runner.os }}-coverity
|
||||
- name: Download Coverity Scan
|
||||
env:
|
||||
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
|
||||
run: |
|
||||
if [ ! -f coverity-latest.tar.gz ]; then
|
||||
wget -q https://scan.coverity.com/download/cxx/linux64 \
|
||||
--post-data "token=$TOKEN&project=${PROJECT_NAME}" \
|
||||
-O coverity-latest.tar.gz
|
||||
else
|
||||
echo "Latest Coverity Scan available from cache :-)"
|
||||
md5sum coverity-latest.tar.gz
|
||||
fi
|
||||
mkdir coverity
|
||||
tar xzf coverity-latest.tar.gz --strip 1 -C coverity
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get -y update
|
||||
sudo apt-get -y install pkg-config libjansson-dev libev-dev libite-dev \
|
||||
libaugeas-dev libglib2.0-dev libpcre2-dev
|
||||
- name: Build dependencies
|
||||
run: |
|
||||
git clone https://github.com/CESNET/libyang.git
|
||||
mkdir libyang/build
|
||||
(cd libyang/build && cmake .. && make all && sudo make install)
|
||||
git clone https://github.com/sysrepo/sysrepo.git
|
||||
mkdir sysrepo/build
|
||||
(cd sysrepo/build && cmake .. && make all && sudo make install)
|
||||
make dep
|
||||
- name: Check applications
|
||||
run: |
|
||||
export PATH=`pwd`/coverity/bin:$PATH
|
||||
cov-build --dir cov-int make check
|
||||
- name: Submit results to Coverity Scan
|
||||
env:
|
||||
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
|
||||
run: |
|
||||
tar czvf ${PROJECT_NAME}.tgz cov-int
|
||||
curl \
|
||||
--form token=$TOKEN \
|
||||
--form email=${CONTACT_EMAIL} \
|
||||
--form file=@${PROJECT_NAME}.tgz \
|
||||
--form version=$(git rev-parse HEAD) \
|
||||
--form description="${PROJECT_NAME} $(git rev-parse HEAD)" \
|
||||
https://scan.coverity.com/builds?project=${PROJECT_NAME}
|
||||
- name: Upload build.log
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: coverity-build.log
|
||||
path: cov-int/build-log.txt
|
||||
@@ -19,10 +19,12 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: 'true'
|
||||
- name: Set Build Variables
|
||||
id: vars
|
||||
run: |
|
||||
target=x86_64-minimal
|
||||
target=x86_64
|
||||
echo "dir=infix-$target" >> $GITHUB_OUTPUT
|
||||
echo "tgz=infix-$target.tar.gz" >> $GITHUB_OUTPUT
|
||||
- name: Restore Cache of dl/
|
||||
@@ -43,9 +45,9 @@ jobs:
|
||||
ccache-x86_64-netconf-
|
||||
ccache-x86_64-
|
||||
ccache-
|
||||
- name: Configure Minimal NETCONF
|
||||
- name: Configure NETCONF
|
||||
run: |
|
||||
make x86_64_minimal_defconfig
|
||||
make x86_64_defconfig
|
||||
- name: Build
|
||||
run: |
|
||||
make
|
||||
@@ -59,6 +61,11 @@ jobs:
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
path: output/${{ steps.vars.outputs.tgz }}
|
||||
|
||||
- name: Regression Test
|
||||
run: |
|
||||
make test-qeneth
|
||||
run: make test-qeneth
|
||||
|
||||
- name: Publish Test Result
|
||||
# Ensure this runs even if Regression Test fails
|
||||
if: always()
|
||||
run: cat test/.log/last/result-gh.md >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
@@ -1,9 +1,21 @@
|
||||
# This job can be started by a git tag or using the workflow dispatch.
|
||||
#
|
||||
# The version string *must* be of the format: vYY.MM(-alphaN|-betaN|-rcN)
|
||||
#
|
||||
# In /etc/os-release this string is used for VERSION, VERSION_ID, and
|
||||
# IMAGE_VERSION, with the 'v' prefix. In release artifact filenames,
|
||||
# and zip file directory names, the 'v' is dropped per convention.
|
||||
name: Release General
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v[0-9]*.*'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
required: false
|
||||
type: string
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -20,17 +32,22 @@ jobs:
|
||||
- name: Set Release Variables
|
||||
id: build
|
||||
run: |
|
||||
ver=${GITHUB_REF#refs/tags/v}
|
||||
if [ -n "${{ inputs.version }}" ]; then
|
||||
ver=${{ inputs.version }}
|
||||
else
|
||||
ver=${GITHUB_REF#refs/tags/}
|
||||
fi
|
||||
echo "ver=${ver}" >> $GITHUB_OUTPUT
|
||||
if echo $ver | grep -qE '[0-9.]+(-alpha|-beta|-rc)[0-9]*'; then
|
||||
if echo $ver | grep -qE 'v[0-9\.]+(-alpha|-beta|-rc)[0-9]*'; then
|
||||
echo "pre=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "pre=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
fver=${ver#v}
|
||||
if [ "${{ matrix.variant }}" = "netconf" ]; then
|
||||
target=${{ matrix.platform }}-${ver}
|
||||
target=${{ matrix.platform }}-${fver}
|
||||
else
|
||||
target=${{ matrix.platform }}-${{ matrix.variant }}-${ver}
|
||||
target=${{ matrix.platform }}-${{ matrix.variant }}-${fver}
|
||||
fi
|
||||
echo "dir=infix-$target" >> $GITHUB_OUTPUT
|
||||
echo "tgz=infix-$target.tar.gz" >> $GITHUB_OUTPUT
|
||||
@@ -78,10 +95,11 @@ jobs:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/download-artifact@v3
|
||||
- name: Extract ChangeLog entry ...
|
||||
run: |
|
||||
awk '/-----*/{if (x == 1) exit; x=1;next}x' doc/ChangeLog.md \
|
||||
awk '/^-----*$/{if (x == 1) exit; x=1;next}x' doc/ChangeLog.md \
|
||||
|head -n -1 > release.md
|
||||
cat release.md
|
||||
- uses: ncipollo/release-action@v1
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
# To enable automatic sync of your Infix fork every day, or on dispatch,
|
||||
# set the repoistory or organisation variable (not secret):
|
||||
#
|
||||
# SYNC_FORK = 'true'
|
||||
# SYNC_FORK = true
|
||||
#
|
||||
# You also need a GH_SYNC_REPO token allowed to update workflows. For
|
||||
# more information on variables and secrets, see the GitHub docs.
|
||||
# See https://docs.github.com/en/actions/learn-github-actions/variables
|
||||
name: Synchronize your fork of Infix with upstream
|
||||
|
||||
@@ -18,9 +20,9 @@ jobs:
|
||||
steps:
|
||||
- uses: TobKed/github-forks-sync-action@master
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
github_token: ${{ secrets.GH_SYNC_REPO }}
|
||||
upstream_repository: KernelKit/infix
|
||||
upstream_branch: main
|
||||
target_branch: main
|
||||
force: true
|
||||
force: false
|
||||
tags: true
|
||||
|
||||
@@ -6,4 +6,5 @@
|
||||
/output*
|
||||
/x-*
|
||||
/test/.venv
|
||||
/test/.log
|
||||
/local.mk
|
||||
|
||||
@@ -1,3 +1,108 @@
|
||||
menu "Branding"
|
||||
|
||||
config INFIX_VENDOR
|
||||
string "Vendor name"
|
||||
default "KernelKit"
|
||||
help
|
||||
The name of the operating system vendor. This is the name of the
|
||||
organization or company which produces the OS.
|
||||
|
||||
This name is intended to be exposed in "About this system" UIs or
|
||||
software update UIs when needed to distinguish the OS vendor from
|
||||
the OS itself. It is intended to be human readable.
|
||||
|
||||
Used for VENDOR_NAME in /etc/os-release and GNS3 appliance files.
|
||||
|
||||
config INFIX_VENDOR_HOME
|
||||
string "Vendor URL"
|
||||
help
|
||||
The homepage of the OS vendor. The value should be in RFC3986
|
||||
format, and should be "http:" or "https:" URLs. Only one URL shall
|
||||
be listed in the setting.
|
||||
|
||||
Optional, used for VENDOR_HOME in /etc/os-release
|
||||
|
||||
config INFIX_NAME
|
||||
string "Operating system name"
|
||||
default "Infix"
|
||||
help
|
||||
Mandatory. Used for identifying the OS as NAME in /etc/os-release
|
||||
and product_name in GNS3 appliance files.
|
||||
|
||||
config INFIX_ID
|
||||
string "Operating system identifier"
|
||||
default "infix"
|
||||
help
|
||||
A lower-case string (no spaces or other characters outside of 0–9,
|
||||
a–z, '.', '_' and '-') identifying the operating system, excluding
|
||||
any version information and suitable for processing by scripts or
|
||||
usage in generated filenames.
|
||||
|
||||
Mandatory. Used for identifying the OS as ID in /etc/os-release and
|
||||
in the generated image name: ID-ARCH-VERSION.img
|
||||
|
||||
config INFIX_IMAGE_ID
|
||||
string "Operating system image name"
|
||||
default "${INFIX_ID}-${BR2_ARCH}"
|
||||
help
|
||||
A lower-case string (no spaces or other characters outside of 0–9,
|
||||
a–z, ".", "_" and "-"), for naming critical image files, directories
|
||||
and archives containting the operating system.
|
||||
|
||||
Mandatory. When INFIX_RELEASE is set, this string is appended to
|
||||
the IMAGE_ID with a '-' separator.
|
||||
|
||||
config INFIX_TAGLINE
|
||||
string "Operating system tagline"
|
||||
default "Infix — a Network Operating System"
|
||||
help
|
||||
Mandatory. Used for identifying the OS, e.g. as PRETTY_NAME in
|
||||
/etc/os-release and description in the GNS3 appliance.
|
||||
|
||||
This is also show at boot when the system init process starts.
|
||||
|
||||
config INFIX_DESC
|
||||
string "Operating system description"
|
||||
help
|
||||
Optional. Used for long description texts about the OS. E.g.,
|
||||
the GNS3 appliance file description field. Saved in the file
|
||||
/etc/os-release as INFIX_DESC.
|
||||
|
||||
config INFIX_HOME
|
||||
string "Operating system URL"
|
||||
help
|
||||
Used for identifying the OS, e.g. as HOME_URL in /etc/os-release
|
||||
|
||||
config INFIX_DOC
|
||||
string "Operating system docs"
|
||||
help
|
||||
Optional. Main documentation URL, will be shown in /etc/os-release
|
||||
as DOCUMENTATION_URL.
|
||||
|
||||
config INFIX_SUPPORT
|
||||
string "Operating system support"
|
||||
help
|
||||
Main support page for the operating system, if there is any. This
|
||||
is primarily intended for operating systems which vendors provide
|
||||
support for. May be a http:, https:, or mailto: URI.
|
||||
|
||||
Optional. Shown, e.g., as SUPPORT_URL in /etc/os-release or
|
||||
maintainer_email in .gns3a.
|
||||
|
||||
config INFIX_OEM_PATH
|
||||
string "Path to OEM br2-external"
|
||||
help
|
||||
A br2-external using Infix will likely want to version the branded
|
||||
OS using their own GIT tags. Set this variable to point to the base
|
||||
directory (absolute path) and the Infix post-build.sh will call `git
|
||||
describe -C $INFIX_OEM_PATH`.
|
||||
|
||||
Note: for release builds the global variable INFIX_RELEASE overrides
|
||||
the version information derived from `git describe`. However, the
|
||||
GIT version is always saved as the BUILD_ID in /etc/os-releases.
|
||||
|
||||
endmenu
|
||||
|
||||
# For /etc/os-release, uses CondtionArchitechture= from systemd.unit(5)
|
||||
config INFIX_ARCH
|
||||
string
|
||||
|
||||
@@ -11,6 +11,10 @@ bmake = $(MAKE) -C buildroot O=$(O) $1
|
||||
all: $(config) buildroot/Makefile
|
||||
@+$(call bmake,$@)
|
||||
|
||||
check dep:
|
||||
@echo "Starting local check, stage $@ ..."
|
||||
@make -C src $@
|
||||
|
||||
$(config):
|
||||
@+$(call bmake,list-defconfigs)
|
||||
@echo "\e[7mERROR: No configuration selected.\e[0m"
|
||||
@@ -25,4 +29,5 @@ $(config):
|
||||
buildroot/Makefile:
|
||||
@git submodule update --init
|
||||
|
||||
.PHONY: all
|
||||
.PHONY: all check
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<img align="right" src="doc/logo.png" alt="Infix - Linux <3 NETCONF" width=480>
|
||||
[![License Badge][]][License] [![Coverity Status][]][Coverity Scan]
|
||||
<img align="right" src="doc/logo.png" alt="Infix - Linux <3 NETCONF" width=480 border=10>
|
||||
<details><summary><b>Documentation</b></summary>
|
||||
|
||||
- **Infix In-Depth**
|
||||
@@ -19,7 +20,54 @@
|
||||
Infix is a Linux Network Operating System (NOS) based on [Buildroot][1],
|
||||
and [sysrepo][2]. A powerful mix that ease porting to different
|
||||
platforms, simplify long-term maintenance, and provide made-easy
|
||||
management using NETCONF[^1].
|
||||
management using NETCONF[^1] (remote) or the built-in [command
|
||||
line interface (CLI)][3] (click the foldout for an example).
|
||||
|
||||
<details><summary><b>Example CLI Session</b></summary>
|
||||
|
||||
The CLI configure context is automatically generated from the loaded
|
||||
YANG models and their corresponding [sysrepo][2] plugins. The following
|
||||
is brief example of how to set the IP address of an interface:
|
||||
|
||||
```
|
||||
admin@infix-12-34-56:/> configure
|
||||
admin@infix-12-34-56:/config/> edit interface eth0
|
||||
admin@infix-12-34-56:/config/interface/eth0/> set ipv4 <TAB>
|
||||
address autoconf bind-ni-name enabled
|
||||
forwarding mtu neighbor
|
||||
admin@infix-12-34-56:/config/interface/eth0/> set ipv4 address 192.168.2.200 prefix-length 24
|
||||
admin@infix-12-34-56:/config/interface/eth0/> show
|
||||
type ethernet;
|
||||
ipv4 {
|
||||
address 192.168.2.200 {
|
||||
prefix-length 24;
|
||||
}
|
||||
}
|
||||
ipv6
|
||||
admin@infix-12-34-56:/config/interface/eth0/> diff
|
||||
interfaces {
|
||||
interface eth0 {
|
||||
+ ipv4 {
|
||||
+ address 192.168.2.200 {
|
||||
+ prefix-length 24;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
}
|
||||
admin@infix-12-34-56:/config/interface/eth0/> leave
|
||||
admin@infix-12-34-56:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 52:54:00:12:34:56
|
||||
ipv4 192.168.2.200/24 (static)
|
||||
ipv6 fe80::5054:ff:fe12:3456/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@infix-12-34-56:/> copy running-config startup-config
|
||||
```
|
||||
|
||||
[Click here][3] for more details.
|
||||
</details>
|
||||
|
||||
Infix can run on many different types of architectures and boards, much
|
||||
thanks to Linux and Buildroot. Currently the focus is on 64-bit ARM
|
||||
@@ -40,8 +88,13 @@ more information, see: [Infix in Virtual Environments](doc/virtual.md).
|
||||
>
|
||||
> For *customer specific builds* of Infix, see your product repository.
|
||||
|
||||
[^1]: or RESTCONF, <https://datatracker.ietf.org/doc/html/rfc8040>, for
|
||||
mode information, see [Infix Variants](doc/variant.md).
|
||||
[^1]: NETCONF or RESTCONF, <https://datatracker.ietf.org/doc/html/rfc8040>,
|
||||
for more information, see [Infix Variants](doc/variant.md).
|
||||
|
||||
[1]: https://buildroot.org/
|
||||
[2]: https://www.sysrepo.org/
|
||||
[3]: doc/cli/introduction.md
|
||||
[License]: https://en.wikipedia.org/wiki/GPL_license
|
||||
[License Badge]: https://img.shields.io/badge/License-GPL%20v2-blue.svg
|
||||
[Coverity Scan]: https://scan.coverity.com/projects/29393
|
||||
[Coverity Status]: https://scan.coverity.com/projects/29393/badge.svg
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
#ifndef _ALDER_MPP_H
|
||||
#define _ALDER_MPP_H
|
||||
|
||||
#define CP_SMI_MDIO(X) X( "mpp0", none, 0, 0)
|
||||
#define CP_SMI_MDC(X) X( "mpp1", none, 0, 0)
|
||||
#define CP_XSMI_MDIO(X) X( "mpp2", none, 0, 0)
|
||||
#define CP_XSMI_MDC(X) X( "mpp3", none, 0, 0)
|
||||
/* mpp4: Unused */
|
||||
/* mpp5: Unused */
|
||||
/* mpp6: Unused */
|
||||
#define SFP9_TX_FAULT(X) X( "mpp7", cp0_gpio1, 7, GPIO_ACTIVE_HIGH)
|
||||
#define SFP9_TX_DISABLE(X) X( "mpp8", cp0_gpio1, 8, GPIO_ACTIVE_HIGH)
|
||||
#define SFP9_MOD_ABS(X) X( "mpp9", cp0_gpio1, 9, GPIO_ACTIVE_LOW)
|
||||
#define SW_RESETn(X) X("mpp10", cp0_gpio1, 10, GPIO_ACTIVE_LOW)
|
||||
#define SFP9_RS0(X) X("mpp11", cp0_gpio1, 11, GPIO_ACTIVE_HIGH)
|
||||
/* mpp12: Unused */
|
||||
#define CP_SPI1_MISO(X) X("mpp13", none, 0, 0)
|
||||
#define CP_SPI1_CS0(X) X("mpp14", none, 0, 0)
|
||||
#define CP_SPI1_MOSI(X) X("mpp15", none, 0, 0)
|
||||
#define CP_SPI1_SCK(X) X("mpp16", none, 0, 0)
|
||||
#define WDT_TICKLE(X) X("mpp17", cp0_gpio1, 17, GPIO_ACTIVE_HIGH)
|
||||
/* mpp18: Unused */
|
||||
/* mpp19: Unused */
|
||||
/* mpp20: Unused */
|
||||
/* mpp21: Unused */
|
||||
/* mpp22: Unused */
|
||||
/* mpp23: Unused */
|
||||
#define DDR_TEN(X) X("mpp24", cp0_gpio1, 24, GPIO_ACTIVE_HIGH)
|
||||
#define ETH9_RESETn(X) X("mpp25", cp0_gpio1, 25, GPIO_ACTIVE_LOW)
|
||||
#define SW_INTn(X) X("mpp26", cp0_gpio1, 26, IRQ_TYPE_LEVEL_LOW)
|
||||
#define SFP9_RS1(X) X("mpp27", cp0_gpio1, 27, GPIO_ACTIVE_HIGH)
|
||||
#define SFP10_TX_FAULT(X) X("mpp28", cp0_gpio1, 28, GPIO_ACTIVE_HIGH)
|
||||
#define CP_UA0_RXD(X) X("mpp29", none, 0, 0)
|
||||
#define CP_UA0_TXD(X) X("mpp30", none, 0, 0)
|
||||
#define SFP10_TX_DISABLE(X) X("mpp31", cp0_gpio1, 31, GPIO_ACTIVE_HIGH)
|
||||
#define SFP10_MOD_ABS(X) X("mpp32", cp0_gpio2, 0, GPIO_ACTIVE_LOW)
|
||||
#define I2C_IRQ(X) X("mpp33", cp0_gpio2, 1, IRQ_TYPE_LEVEL_LOW)
|
||||
#define SFP10_RS0(X) X("mpp34", cp0_gpio2, 2, GPIO_ACTIVE_HIGH)
|
||||
#define CP_I2C1_SDA(X) X("mpp35", none, 0, 0)
|
||||
#define CP_I2C1_SCK(X) X("mpp36", none, 0, 0)
|
||||
#define CP_I2C0_SCK(X) X("mpp37", none, 0, 0)
|
||||
#define CP_I2C0_SDA(X) X("mpp38", none, 0, 0)
|
||||
#define SFP10_RX_LOS(X) X("mpp39", cp0_gpio2, 7, GPIO_ACTIVE_HIGH)
|
||||
#define SFP10_RS1(X) X("mpp40", cp0_gpio2, 8, GPIO_ACTIVE_HIGH)
|
||||
#define CP_SD_CRD_PWR_OFF(X) X("mpp41", none, 0, 0)
|
||||
#define CP_SD_HST_18_EN(X) X("mpp42", none, 0, 0)
|
||||
#define CP_SD_CRD_DT(X) X("mpp43", none, 0, 0)
|
||||
#define ETH9_INTn(X) X("mpp44", cp0_gpio2, 12, GPIO_ACTIVE_LOW)
|
||||
/* mpp45: Unused */
|
||||
#define ETH10_RESETn(X) X("mpp46", cp0_gpio2, 14, GPIO_ACTIVE_LOW)
|
||||
#define I2C_RESETn(X) X("mpp47", cp0_gpio2, 15, GPIO_ACTIVE_LOW)
|
||||
#define ETH10_INTn(X) X("mpp48", cp0_gpio2, 16, GPIO_ACTIVE_LOW)
|
||||
#define DEV_MODEn(X) X("mpp49", cp0_gpio2, 17, GPIO_ACTIVE_LOW)
|
||||
#define USB1_VBUS_ENABLE(X) X("mpp50", cp0_gpio2, 18, GPIO_ACTIVE_HIGH)
|
||||
#define USB1_VBUS_ERROR_OC(X) X("mpp51", cp0_gpio2, 19, GPIO_ACTIVE_HIGH)
|
||||
/* mpp52: Unused */
|
||||
#define SFP9_RX_LOS(X) X("mpp53", cp0_gpio2, 21, GPIO_ACTIVE_HIGH)
|
||||
/* mpp54: Unused */
|
||||
#define CP_SD_LED(X) X("mpp55", none, 0, 0)
|
||||
#define CP_SD_CLK(X) X("mpp56", none, 0, 0)
|
||||
#define CP_SD_CMD(X) X("mpp57", none, 0, 0)
|
||||
#define CP_SD_D0(X) X("mpp58", none, 0, 0)
|
||||
#define CP_SD_D1(X) X("mpp59", none, 0, 0)
|
||||
#define CP_SD_D2(X) X("mpp60", none, 0, 0)
|
||||
#define CP_SD_D3(X) X("mpp61", none, 0, 0)
|
||||
/* mpp62: Unused */
|
||||
|
||||
/* Macros to extract MPP info in different formats */
|
||||
#define MPP_ID(_mpp, _chip, _no, _flags) _mpp
|
||||
#define MPP_GPIO_CHIP(_mpp, _chip, _no, _flags) _chip
|
||||
|
||||
#define MPP_GPIO_REF(_mpp, _chip, _no, _flags) <&_chip _no _flags>
|
||||
#define MPP_GPIO_REF_NO_CHIP(_mpp, _chip, _no, _flags) <_no _flags>
|
||||
#define MPP_IRQ_REF(_mpp, _chip, _no, _flags) <&_chip _no _flags>
|
||||
|
||||
#endif /* _ALDER_MPP_H */
|
||||
@@ -0,0 +1,9 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (C) 2021 Marvell International Ltd.
|
||||
* Copyright (C) 2023 Addiva Elektronik AB
|
||||
*
|
||||
* Device tree for Alder board
|
||||
*/
|
||||
|
||||
#include "alder.dtsi"
|
||||
@@ -0,0 +1,752 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (C) 2021 Marvell International Ltd.
|
||||
* Copyright (C) 2023 Addiva Elektronik AB
|
||||
*
|
||||
* Device tree for Alder board
|
||||
*/
|
||||
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/leds/common.h>
|
||||
|
||||
#include "../marvell/cn9130-patched.dtsi"
|
||||
|
||||
#include "alder-mpp.h"
|
||||
|
||||
/ {
|
||||
model = "Alder";
|
||||
compatible = "alder,alder",
|
||||
"marvell,armada-ap807-quad",
|
||||
"marvell,armada-ap807";
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
|
||||
infix {
|
||||
vpds = <&vpd_cpu &vpd_product &vpd_power>;
|
||||
};
|
||||
};
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x0 0x0 0x0 0x80000000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* UART0 (Console) */
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_uart0_pins: cp0-uart0-pins {
|
||||
marvell,pins = CP_UA0_RXD(MPP_ID), CP_UA0_TXD(MPP_ID);
|
||||
marvell,function = "uart0";
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_uart0_pins>;
|
||||
};
|
||||
|
||||
|
||||
/* GPIO */
|
||||
|
||||
&cp0_gpio1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&cp0_gpio2 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
||||
/* I2C0 (EEPROM) */
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_i2c0_pins: cp0-i2c0-pins {
|
||||
marvell,pins = CP_I2C0_SCK(MPP_ID), CP_I2C0_SDA(MPP_ID);
|
||||
marvell,function = "i2c0";
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_i2c0 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_i2c0_pins>;
|
||||
|
||||
vpd_cpu: eeprom@50 {
|
||||
// AT24C256C-MAHL-T
|
||||
compatible = "atmel,24c256";
|
||||
reg = <0x50>;
|
||||
|
||||
infix,board = "cpu";
|
||||
infix,trusted;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* I2C1 (Mux) */
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_i2c1_pins: cp0-i2c1-pins {
|
||||
marvell,pins = CP_I2C1_SCK(MPP_ID), CP_I2C1_SDA(MPP_ID);
|
||||
marvell,function = "i2c1";
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_i2c1 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_i2c1_pins>;
|
||||
|
||||
i2cmux@70 {
|
||||
compatible = "nxp,pca9548";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x70>;
|
||||
|
||||
reset-gpios = I2C_RESETn(MPP_GPIO_REF);
|
||||
|
||||
i2c_sysmgmt: i2c@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0>;
|
||||
};
|
||||
|
||||
i2c_pwr: i2c@1 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <1>;
|
||||
};
|
||||
|
||||
i2c_sw: i2c@2 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <2>;
|
||||
};
|
||||
|
||||
i2c_sfp9: i2c@3 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <3>;
|
||||
};
|
||||
|
||||
i2c_sfpa: i2c@4 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <4>;
|
||||
};
|
||||
|
||||
i2c@5 {
|
||||
status = "disabled";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <5>;
|
||||
};
|
||||
|
||||
i2c@6 {
|
||||
status = "disabled";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <6>;
|
||||
};
|
||||
|
||||
i2c@7 {
|
||||
status = "disabled";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <7>;
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* System Management */
|
||||
|
||||
&i2c_sysmgmt {
|
||||
vpd_product: eeprom@b {
|
||||
label = "vpd";
|
||||
reg = <0x0b>;
|
||||
compatible = "atmel,24c02";
|
||||
|
||||
infix,board = "product";
|
||||
|
||||
nvmem-layout {
|
||||
compatible = "onie,tlv-layout";
|
||||
|
||||
base_mac: mac-address {
|
||||
#nvmem-cell-cells = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
/* AP SDHCI (eMMC) */
|
||||
|
||||
&ap_sdhci0 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
/* pinctrl-0 = <&ap_emmc_pins>; No pinctrl in Linux? */
|
||||
bus-width = <8>;
|
||||
mmc-ddr-1_8v;
|
||||
mmc-hs400-1_8v;
|
||||
};
|
||||
|
||||
|
||||
/* CP SDHCI (Micro-SD) */
|
||||
|
||||
/ {
|
||||
cp0_reg_sd_vccq: cp0_sd_vccq@0 {
|
||||
compatible = "regulator-gpio";
|
||||
regulator-name = "cp0_sd_vccq";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
/* gpios = <&CP_SD_HST_18_EN>; */
|
||||
states = <1800000 0x1
|
||||
3300000 0x0>;
|
||||
};
|
||||
|
||||
cp0_reg_sd_vcc: cp0_sd_vcc@0 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "cp0_sd_vcc";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
/* gpio = <&CP_SD_CRD_PWR_OFF>; */
|
||||
enable-active-high;
|
||||
regulator-always-on;
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_sdhci_pins: cp0-sdhi-pins-0 {
|
||||
marvell,pins = \
|
||||
CP_SD_CRD_PWR_OFF(MPP_ID), CP_SD_HST_18_EN(MPP_ID), \
|
||||
CP_SD_CRD_DT(MPP_ID), CP_SD_LED(MPP_ID), \
|
||||
CP_SD_CLK(MPP_ID), CP_SD_CMD(MPP_ID), \
|
||||
CP_SD_D0(MPP_ID), CP_SD_D1(MPP_ID), \
|
||||
CP_SD_D2(MPP_ID), CP_SD_D3(MPP_ID);
|
||||
marvell,function = "sdio";
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_sdhci0 {
|
||||
status = "disabled";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_sdhci_pins>;
|
||||
bus-width = <4>;
|
||||
/* cd-gpios = <&CP_SD_CRD_DT>; */
|
||||
vqmmc-supply = <&cp0_reg_sd_vccq>;
|
||||
vmmc-supply = <&cp0_reg_sd_vcc>;
|
||||
};
|
||||
|
||||
|
||||
/* SPI1 (Boot FLASH) */
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_spi1_pins: cp0-spi-pins-0 {
|
||||
marvell,pins = \
|
||||
CP_SPI1_MISO(MPP_ID), CP_SPI1_CS0(MPP_ID), \
|
||||
CP_SPI1_MOSI(MPP_ID), CP_SPI1_SCK(MPP_ID);
|
||||
marvell,function = "spi1";
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_spi1 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_spi1_pins>;
|
||||
|
||||
/* Boot flash */
|
||||
spi-flash@0 {
|
||||
#address-cells = <0x1>;
|
||||
#size-cells = <0x1>;
|
||||
compatible = "jedec,spi-nor", "spi-flash";
|
||||
reg = <0x0>;
|
||||
/* On-board MUX does not allow higher frequencies */
|
||||
spi-max-frequency = <40000000>;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
boot0@0 {
|
||||
label = "boot0";
|
||||
reg = <0x0 0x200000>;
|
||||
};
|
||||
|
||||
boot1@200000 {
|
||||
label = "boot1";
|
||||
reg = <0x200000 0x200000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* USB1 */
|
||||
|
||||
/ {
|
||||
cp0_usb3_0_phy1: cp0_usb3_phy {
|
||||
compatible = "usb-nop-xceiv";
|
||||
vcc-supply = <®_cp0_usb3_vbus1>;
|
||||
};
|
||||
|
||||
reg_cp0_usb3_vbus1: reg_cp0_usb3_vbus1 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "cp0-xhci1-vbus";
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
enable-active-high;
|
||||
gpio = USB1_VBUS_ENABLE(MPP_GPIO_REF);
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_utmi {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&cp0_utmi1 {
|
||||
status = "okay";
|
||||
dr_mode = "host";
|
||||
};
|
||||
|
||||
&cp0_usb3_1 {
|
||||
status = "disabled";
|
||||
usb-phy = <&cp0_usb3_0_phy1>;
|
||||
phys = <&cp0_utmi1>, <&cp0_comphy3 1>;
|
||||
phy-names = "usb", "usb3";
|
||||
dr_mode = "host";
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/* ETH0 (DSA connection to switch) */
|
||||
|
||||
&cp0_crypto {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&cp0_ethernet {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&cp0_eth0 {
|
||||
status = "okay";
|
||||
phy-mode = "10gbase-r";
|
||||
phys = <&cp0_comphy4 0>;
|
||||
managed = "in-band-status";
|
||||
|
||||
nvmem-cells = <&base_mac 0>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
};
|
||||
|
||||
|
||||
/* MDIO (Switch) */
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_mdio_pins: cp0-mdio-pins-0 {
|
||||
marvell,pins = CP_SMI_MDIO(MPP_ID), CP_SMI_MDC(MPP_ID);
|
||||
marvell,function = "ge";
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_mdio {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_mdio_pins>;
|
||||
|
||||
sw: switch@0 {
|
||||
compatible = "marvell,mv88e6190";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0>;
|
||||
|
||||
reset-gpios = SW_RESETn(MPP_GPIO_REF);
|
||||
|
||||
interrupts-extended = SW_INTn(MPP_IRQ_REF);
|
||||
interrupt-controller;
|
||||
|
||||
dsa,member = <0 0>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
port@0 {
|
||||
reg = <0x0>;
|
||||
label = "cpu";
|
||||
ethernet = <&cp0_eth0>;
|
||||
phy-mode = "10gbase-r";
|
||||
fixed-link {
|
||||
speed = <10000>;
|
||||
full-duplex;
|
||||
};
|
||||
};
|
||||
|
||||
#define SWP_COMMON(_n, _label, _mac_offs, _phymode, _phy) \
|
||||
reg = <0x ## _n>; \
|
||||
label = _label; \
|
||||
phy-mode = _phymode; \
|
||||
phy-handle = <&_phy>; \
|
||||
\
|
||||
nvmem-cells = <&base_mac _mac_offs>; \
|
||||
nvmem-cell-names = "mac-address"
|
||||
|
||||
#define XSWP(_n, _label, _mac_offs, _phy) \
|
||||
port@_n { \
|
||||
SWP_COMMON(_n, _label, _mac_offs, "usxgmii", _phy); \
|
||||
}
|
||||
|
||||
#define GSWP(_n, _label, _mac_offs, _phy) \
|
||||
port@_n { \
|
||||
SWP_COMMON(_n, _label, _mac_offs, "gmii", _phy); \
|
||||
\
|
||||
leds { \
|
||||
#address-cells = <1>; \
|
||||
#size-cells = <0>; \
|
||||
\
|
||||
led@0 { \
|
||||
reg = <0>; \
|
||||
function = "tp"; \
|
||||
color = <LED_COLOR_ID_GREEN>; \
|
||||
default-state = "keep"; \
|
||||
}; \
|
||||
led@1 { \
|
||||
reg = <1>; \
|
||||
function = "tp"; \
|
||||
color = <LED_COLOR_ID_YELLOW>; \
|
||||
default-state = "off"; \
|
||||
}; \
|
||||
}; \
|
||||
}
|
||||
|
||||
XSWP(9, "x1", 1, xphy9);
|
||||
XSWP(a, "x2", 2, xphya);
|
||||
|
||||
GSWP(8, "x3", 3, swphy8);
|
||||
GSWP(7, "x4", 4, swphy7);
|
||||
GSWP(6, "x5", 5, swphy6);
|
||||
GSWP(5, "x6", 6, swphy5);
|
||||
GSWP(4, "x7", 7, swphy4);
|
||||
GSWP(3, "x8", 8, swphy3);
|
||||
GSWP(2, "x9", 9, swphy2);
|
||||
GSWP(1, "x10", 10, swphy1);
|
||||
#undef GSWP
|
||||
#undef XSWP
|
||||
#undef SWP_COMMON
|
||||
};
|
||||
|
||||
mdio {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
#define SWPHY(_n) \
|
||||
ethernet-phy@_n { \
|
||||
compatible = "ethernet-phy-ieee802.3-c22"; \
|
||||
reg = <_n>; \
|
||||
eee-broken-100tx; \
|
||||
eee-broken-1000t; \
|
||||
}
|
||||
|
||||
swphy1: SWPHY(1);
|
||||
swphy2: SWPHY(2);
|
||||
swphy3: SWPHY(3);
|
||||
swphy4: SWPHY(4);
|
||||
swphy5: SWPHY(5);
|
||||
swphy6: SWPHY(6);
|
||||
swphy7: SWPHY(7);
|
||||
swphy8: SWPHY(8);
|
||||
#undef SWPHY
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* XMDIO (88X3310P 10G PHYs) */
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_xmdio_pins: cp0-xmdio-pins-0 {
|
||||
marvell,pins = CP_XSMI_MDIO(MPP_ID), CP_XSMI_MDC(MPP_ID);
|
||||
marvell,function = "xg";
|
||||
};
|
||||
};
|
||||
|
||||
Ð9_RESETn(MPP_GPIO_CHIP) {
|
||||
xphy9-reset-hog {
|
||||
gpio-hog;
|
||||
gpios = ETH9_RESETn(MPP_GPIO_REF_NO_CHIP);
|
||||
output-low;
|
||||
line-name = "x1-phy-reset";
|
||||
};
|
||||
};
|
||||
|
||||
Ð10_RESETn(MPP_GPIO_CHIP) {
|
||||
xphya-reset-hog {
|
||||
gpio-hog;
|
||||
gpios = ETH10_RESETn(MPP_GPIO_REF_NO_CHIP);
|
||||
output-low;
|
||||
line-name = "x2-phy-reset";
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_xmdio {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_xmdio_pins>;
|
||||
|
||||
/* 88X3310 specifices 35ns minimum MDC period (28.57 MHz). */
|
||||
clock-frequency = <28571428>;
|
||||
|
||||
#define XPHY(_n, _sfp) \
|
||||
ethernet-phy@_n { \
|
||||
compatible = "ethernet-phy-ieee802.3-c45"; \
|
||||
reg = <_n>; \
|
||||
sfp = <&_sfp>; \
|
||||
\
|
||||
leds { \
|
||||
#address-cells = <1>; \
|
||||
#size-cells = <0>; \
|
||||
\
|
||||
led@0 { \
|
||||
reg = <0>; \
|
||||
function = "tp"; \
|
||||
color = <LED_COLOR_ID_YELLOW>; \
|
||||
default-state = "off"; \
|
||||
\
|
||||
marvell,media = "copper"; \
|
||||
marvell,polarity = "active-high"; \
|
||||
}; \
|
||||
led@1 { \
|
||||
reg = <1>; \
|
||||
function = "tp"; \
|
||||
color = <LED_COLOR_ID_GREEN>; \
|
||||
default-state = "keep"; \
|
||||
\
|
||||
marvell,media = "copper"; \
|
||||
marvell,polarity = "active-high"; \
|
||||
}; \
|
||||
\
|
||||
led@2 { \
|
||||
reg = <2>; \
|
||||
function = "sfp"; \
|
||||
color = <LED_COLOR_ID_YELLOW>; \
|
||||
default-state = "off"; \
|
||||
\
|
||||
marvell,media = "fiber"; \
|
||||
marvell,polarity = "active-high"; \
|
||||
}; \
|
||||
led@3 { \
|
||||
reg = <3>; \
|
||||
function = "sfp"; \
|
||||
color = <LED_COLOR_ID_GREEN>; \
|
||||
default-state = "keep"; \
|
||||
\
|
||||
marvell,media = "fiber"; \
|
||||
marvell,polarity = "active-high"; \
|
||||
}; \
|
||||
}; \
|
||||
}
|
||||
|
||||
xphy9: XPHY(4, sfp9);
|
||||
xphya: XPHY(5, sfpa);
|
||||
#undef XPHY
|
||||
};
|
||||
|
||||
/ {
|
||||
sfp9: sfp@9 {
|
||||
compatible = "sff,sfp";
|
||||
i2c-bus = <&i2c_sfp9>;
|
||||
mod-def0-gpios = SFP9_MOD_ABS(MPP_GPIO_REF);
|
||||
los-gpios = SFP9_RX_LOS(MPP_GPIO_REF);
|
||||
tx-disable-gpios = SFP9_TX_DISABLE(MPP_GPIO_REF);
|
||||
tx-fault-gpios = SFP9_TX_FAULT(MPP_GPIO_REF);
|
||||
rate-select0-gpios = SFP9_RS0(MPP_GPIO_REF);
|
||||
rate-select1-gpios = SFP9_RS1(MPP_GPIO_REF);
|
||||
maximum-power-milliwatt = <3000>;
|
||||
};
|
||||
|
||||
sfpa: sfp@a {
|
||||
compatible = "sff,sfp";
|
||||
i2c-bus = <&i2c_sfpa>;
|
||||
mod-def0-gpios = SFP10_MOD_ABS(MPP_GPIO_REF);
|
||||
los-gpios = SFP10_RX_LOS(MPP_GPIO_REF);
|
||||
tx-disable-gpios = SFP10_TX_DISABLE(MPP_GPIO_REF);
|
||||
tx-fault-gpios = SFP10_TX_FAULT(MPP_GPIO_REF);
|
||||
rate-select0-gpios = SFP10_RS0(MPP_GPIO_REF);
|
||||
rate-select1-gpios = SFP10_RS1(MPP_GPIO_REF);
|
||||
maximum-power-milliwatt = <3000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* Power Board */
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_pwr_gpio_pins: cp0-pwr-gpio-0 {
|
||||
marvell,pins = I2C_IRQ(MPP_ID);
|
||||
marvell,function = "gpio";
|
||||
};
|
||||
};
|
||||
|
||||
&i2c_pwr {
|
||||
// Shared IRQ on I2C_IRQ
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_pwr_gpio_pins>;
|
||||
|
||||
// 0x26 U13 PCF8574 GPIO I/O
|
||||
gpio_pwr1: gpio@26 {
|
||||
compatible = "nxp,pcf8574a";
|
||||
#gpio-cells = <2>;
|
||||
gpio-controller;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-controller;
|
||||
interrupts-extended = I2C_IRQ(MPP_IRQ_REF);
|
||||
reg = <0x26>;
|
||||
#define GPIO_PWR1_UNUSED0 gpio_pwr1 0 GPIO_ACTIVE_HIGH
|
||||
#define GPIO_PWR1_UNUSED1 gpio_pwr1 1 GPIO_ACTIVE_HIGH
|
||||
#define GPIO_POE_PGOOD gpio_pwr1 2 GPIO_ACTIVE_HIGH
|
||||
#define GPIO_RESET_BUTTON gpio_pwr1 3 GPIO_ACTIVE_LOW
|
||||
#define GPIO_VIN1_PGOOD gpio_pwr1 4 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED_VIN2_ALERT gpio_pwr1 5 GPIO_ACTIVE_LOW
|
||||
#define GPIO_VIN2_PGOOD gpio_pwr1 6 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED_VIN1_ALERT gpio_pwr1 7 GPIO_ACTIVE_LOW
|
||||
};
|
||||
|
||||
//0x27 U3 PCF8574 GPIO LED
|
||||
gpio_pwr2: gpio@27 {
|
||||
compatible = "nxp,pcf8574a";
|
||||
#gpio-cells = <2>;
|
||||
gpio-controller;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-controller;
|
||||
interrupts-extended = I2C_IRQ(MPP_IRQ_REF);
|
||||
reg = <0x27>;
|
||||
#define GPIO_LED2G gpio_pwr2 0 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED2R gpio_pwr2 1 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED1G gpio_pwr2 2 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED1R gpio_pwr2 3 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED4G gpio_pwr2 4 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED4R gpio_pwr2 5 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED3G gpio_pwr2 6 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED3R gpio_pwr2 7 GPIO_ACTIVE_LOW
|
||||
};
|
||||
|
||||
//0x28* U5 TPS23861PWR PoE Controller
|
||||
//0x30 U5 TPS23861PWR PoE Controller broadcast
|
||||
|
||||
//0x50 U15 AT24C256C EEPROM
|
||||
vpd_power: eeprom@50 {
|
||||
// AT24C256C-MAHL-T
|
||||
compatible = "atmel,24c256";
|
||||
reg = <0x50>;
|
||||
|
||||
infix,board = "power";
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* System LEDs */
|
||||
|
||||
/ {
|
||||
power-a {
|
||||
compatible = "gpio-charger";
|
||||
charger-type = "mains";
|
||||
gpios = <&GPIO_VIN1_PGOOD>;
|
||||
};
|
||||
|
||||
power-b {
|
||||
compatible = "gpio-charger";
|
||||
charger-type = "mains";
|
||||
gpios = <&GPIO_VIN2_PGOOD>;
|
||||
};
|
||||
|
||||
leds: leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
led-statg {
|
||||
function = LED_FUNCTION_STATUS;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
gpios = <&GPIO_LED1G>;
|
||||
};
|
||||
|
||||
led-statr {
|
||||
function = LED_FUNCTION_STATUS;
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
gpios = <&GPIO_LED1R>;
|
||||
};
|
||||
|
||||
led-faultg {
|
||||
function = LED_FUNCTION_FAULT;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
gpios = <&GPIO_LED2G>;
|
||||
};
|
||||
|
||||
led-faultr {
|
||||
function = LED_FUNCTION_FAULT;
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
gpios = <&GPIO_LED2R>;
|
||||
};
|
||||
|
||||
led-lang {
|
||||
function = LED_FUNCTION_LAN;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
gpios = <&GPIO_LED3G>;
|
||||
};
|
||||
|
||||
led-lanr {
|
||||
function = LED_FUNCTION_LAN;
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
gpios = <&GPIO_LED3R>;
|
||||
};
|
||||
|
||||
led-bootg {
|
||||
function = LED_FUNCTION_BOOT;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
gpios = <&GPIO_LED4G>;
|
||||
};
|
||||
|
||||
led-bootr {
|
||||
function = LED_FUNCTION_BOOT;
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
gpios = <&GPIO_LED4R>;
|
||||
default-state = "on";
|
||||
linux,default-trigger = "timer";
|
||||
};
|
||||
|
||||
led-vin1-alert {
|
||||
function = "power-a";
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
gpios = <&GPIO_LED_VIN1_ALERT>;
|
||||
};
|
||||
|
||||
led-vin2-alert {
|
||||
function = "power-b";
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
gpios = <&GPIO_LED_VIN2_ALERT>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
/* Watchdog */
|
||||
|
||||
&cp0_pinctrl {
|
||||
watchdog_pins: watchdog-pins {
|
||||
marvell,pins = WDT_TICKLE(MPP_ID);
|
||||
marvell,function = "gpio";
|
||||
};
|
||||
};
|
||||
|
||||
/ {
|
||||
sysmgmt-watchdog {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&watchdog_pins>;
|
||||
compatible = "linux,wdt-gpio";
|
||||
gpios = WDT_TICKLE(MPP_GPIO_REF);
|
||||
always-running;
|
||||
hw_algo = "toggle";
|
||||
hw_margin_ms = <20000>; /* toggle period must be below 1 minute */
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,8 @@
|
||||
#include "cn9130.dtsi"
|
||||
|
||||
&cp0_syscon0 {
|
||||
cp0_pinctrl: pinctrl {
|
||||
/* For some reason, this is missing from cn9130.dtsi */
|
||||
compatible = "marvell,cp115-standalone-pinctrl";
|
||||
};
|
||||
};
|
||||
@@ -5,7 +5,7 @@
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include "microchip/sparx5_pcb135_emmc.dts"
|
||||
#include "sparx5_pcb135_emmc.dts"
|
||||
|
||||
&cpu0 {
|
||||
enable-method = "spin-table";
|
||||
|
||||
@@ -262,7 +262,7 @@ CONFIG_VETH=m
|
||||
CONFIG_VIRTIO_NET=y
|
||||
CONFIG_NLMON=y
|
||||
CONFIG_NET_VRF=y
|
||||
CONFIG_NET_DSA_MV88E6XXX=y
|
||||
CONFIG_NET_DSA_MV88E6XXX=m
|
||||
CONFIG_NET_DSA_MV88E6XXX_PTP=y
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_NET_VENDOR_ADAPTEC is not set
|
||||
@@ -287,8 +287,8 @@ CONFIG_NET_DSA_MV88E6XXX_PTP=y
|
||||
# CONFIG_NET_VENDOR_GOOGLE is not set
|
||||
# CONFIG_NET_VENDOR_HISILICON is not set
|
||||
# CONFIG_NET_VENDOR_HUAWEI is not set
|
||||
CONFIG_MVNETA=y
|
||||
CONFIG_MVPP2=y
|
||||
CONFIG_MVNETA=m
|
||||
CONFIG_MVPP2=m
|
||||
# CONFIG_NET_VENDOR_MELLANOX is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
CONFIG_SPARX5_SWITCH=y
|
||||
@@ -326,15 +326,16 @@ CONFIG_8139CP=y
|
||||
# CONFIG_NET_VENDOR_XILINX is not set
|
||||
CONFIG_SFP=y
|
||||
CONFIG_MARVELL_PHY=y
|
||||
CONFIG_MARVELL_10G_PHY=y
|
||||
CONFIG_MARVELL_10G_PHY=m
|
||||
CONFIG_MICREL_PHY=y
|
||||
CONFIG_MICROCHIP_PHY=y
|
||||
CONFIG_MICROCHIP_T1_PHY=y
|
||||
CONFIG_MICROSEMI_PHY=y
|
||||
CONFIG_MICROSEMI_PHY=m
|
||||
CONFIG_MDIO_BITBANG=y
|
||||
CONFIG_MDIO_MVUSB=y
|
||||
CONFIG_MDIO_MSCC_MIIM=y
|
||||
CONFIG_MDIO_BUS_MUX_MMIOREG=y
|
||||
CONFIG_USB_RTL8152=y
|
||||
CONFIG_USB_USBNET=y
|
||||
CONFIG_USB_NET_CDC_EEM=y
|
||||
# CONFIG_USB_NET_CDC_NCM is not set
|
||||
@@ -371,6 +372,7 @@ CONFIG_I2C_SLAVE=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_ARMADA_3700=y
|
||||
CONFIG_SPI_NXP_FLEXSPI=y
|
||||
CONFIG_SPI_ORION=y
|
||||
CONFIG_SPI_PL022=y
|
||||
CONFIG_SPI_MUX=y
|
||||
CONFIG_SPI_SPIDEV=m
|
||||
@@ -382,6 +384,7 @@ CONFIG_GPIO_PL061=y
|
||||
CONFIG_GPIO_XGENE=y
|
||||
CONFIG_GPIO_PCA953X=y
|
||||
CONFIG_GPIO_PCA953X_IRQ=y
|
||||
CONFIG_GPIO_PCF857X=y
|
||||
CONFIG_GPIO_MAX77620=y
|
||||
CONFIG_POWER_RESET_GPIO_RESTART=y
|
||||
CONFIG_POWER_RESET_XGENE=y
|
||||
@@ -398,6 +401,7 @@ CONFIG_ARMADA_THERMAL=y
|
||||
CONFIG_WATCHDOG=y
|
||||
CONFIG_WATCHDOG_SYSFS=y
|
||||
CONFIG_SOFT_WATCHDOG=y
|
||||
CONFIG_GPIO_WATCHDOG=y
|
||||
CONFIG_ARMADA_37XX_WATCHDOG=y
|
||||
CONFIG_I6300ESB_WDT=y
|
||||
CONFIG_MFD_MAX77620=y
|
||||
@@ -458,6 +462,7 @@ CONFIG_MMC_SPI=y
|
||||
CONFIG_MMC_DW=y
|
||||
CONFIG_MMC_DW_EXYNOS=y
|
||||
CONFIG_MMC_DW_K3=y
|
||||
CONFIG_MMC_CQHCI=y
|
||||
CONFIG_MMC_SDHCI_XENON=y
|
||||
CONFIG_SCSI_UFSHCD=y
|
||||
CONFIG_SCSI_UFSHCD_PLATFORM=y
|
||||
@@ -466,8 +471,10 @@ CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LEDS_SYSCON=y
|
||||
CONFIG_LEDS_TRIGGERS=y
|
||||
CONFIG_LEDS_TRIGGER_TIMER=y
|
||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
||||
CONFIG_LEDS_TRIGGER_CPU=y
|
||||
CONFIG_LEDS_TRIGGER_NETDEV=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_MAX77686=y
|
||||
CONFIG_RTC_DRV_PCF8523=y
|
||||
@@ -498,7 +505,9 @@ CONFIG_TI_ADC081C=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PHY_XGENE=y
|
||||
CONFIG_PHY_MVEBU_CP110_COMPHY=y
|
||||
CONFIG_PHY_MVEBU_CP110_UTMI=y
|
||||
CONFIG_PHY_SAMSUNG_USB2=y
|
||||
CONFIG_NVMEM_LAYOUT_ONIE_TLV=y
|
||||
CONFIG_MUX_MMIO=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT3_FS=y
|
||||
@@ -533,6 +542,7 @@ CONFIG_IRQ_POLL=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
label Infix (aarch64)
|
||||
kernel /boot/Image
|
||||
fdtdir /boot
|
||||
append ${bootargs_root} ${bootargs_rauc} ${bootargs_log}
|
||||
append ${bootargs_root} ${bootargs_log} -- ${bootargs_user}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
x33x0fw_0_3_11_0_11832.hdr
|
||||
@@ -415,17 +415,11 @@ a printer can publish IPP records with meta data on the printer type and model
|
||||
or donwload URL for drivers. Switches and routers usually publish how they
|
||||
can be reached: HTTP/HTTPS and SSH.
|
||||
|
||||
Note: there are other mechanisms for device discovery. Microsoft have been
|
||||
slow to adopt mDNS, having relied on their own SSDP protocol. For the
|
||||
full experince Apple's "Bonjour" can be installed in Windows.
|
||||
|
||||
mDNS is supported in this product and should be enabled by default. To
|
||||
verify it works, open the Windows File Explorer (Win+E) and scroll to
|
||||
Network in the left-hand menu. An icon with a matching hostname can be
|
||||
found there which, when clicked, opens up the device's Web Interface.
|
||||
macOS users have mDNS fully integrated by default. Linux users can use
|
||||
'mdns-scan' or Avahi, as shown above. The latter two can also just set
|
||||
their web browsers to https://hostname-01-02-03.local
|
||||
mDNS is supported in this product and should be enabled by default. To
|
||||
verify that it works, in Windows, macOS, or Linux, open your web browser
|
||||
and point it to <https://hostname-01-02-03.local>. This is the hostname
|
||||
and three last octets of the device's base MAC address. You can also use
|
||||
mDNS browsers or command line tools like mdns-scan
|
||||
|
||||
|
||||
$(h2 "VLAN Interfaces")
|
||||
|
||||
@@ -23,7 +23,7 @@ config SIGN_KEY
|
||||
menuconfig DISK_IMAGE
|
||||
bool "Disk image"
|
||||
help
|
||||
Compose a full disk image with redundant firmware partitions,
|
||||
Compose a full disk image with redundant Linux OS partitions,
|
||||
configuration partition, etc.
|
||||
|
||||
This is useful when:
|
||||
@@ -100,7 +100,7 @@ config DISK_IMAGE_RELEASE_URL
|
||||
menuconfig GNS3_APPLIANCE
|
||||
bool "GNS3 Appliance"
|
||||
select DISK_IMAGE
|
||||
default y if BR2_x86_64
|
||||
default y
|
||||
help
|
||||
Create a GNS3 appliance description that, together with the
|
||||
disk image, can be imported into GNS3.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Busybox version: 1.36.0
|
||||
# Fri Jul 7 17:59:34 2023
|
||||
# Tue Oct 3 18:00:40 2023
|
||||
#
|
||||
CONFIG_HAVE_DOT_CONFIG=y
|
||||
|
||||
@@ -538,7 +538,7 @@ CONFIG_LAST_ID=60000
|
||||
CONFIG_FIRST_SYSTEM_ID=100
|
||||
CONFIG_LAST_SYSTEM_ID=999
|
||||
# CONFIG_CHPASSWD is not set
|
||||
CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="md5"
|
||||
CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="sha512"
|
||||
CONFIG_CRYPTPW=y
|
||||
CONFIG_MKPASSWD=y
|
||||
CONFIG_DELUSER=y
|
||||
@@ -556,7 +556,7 @@ CONFIG_SU=y
|
||||
CONFIG_FEATURE_SU_SYSLOG=y
|
||||
CONFIG_FEATURE_SU_CHECKS_SHELLS=y
|
||||
# CONFIG_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set
|
||||
CONFIG_SULOGIN=y
|
||||
# CONFIG_SULOGIN is not set
|
||||
CONFIG_VLOCK=y
|
||||
|
||||
#
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
|
||||
image aux.ext4 {
|
||||
mountpoint = "/aux"
|
||||
temporary = true
|
||||
size = 2M
|
||||
|
||||
ext4 {
|
||||
label = "aux"
|
||||
}
|
||||
}
|
||||
|
||||
image cfg.ext4 {
|
||||
empty = true
|
||||
temporary = true
|
||||
size = 16M
|
||||
|
||||
ext4 {
|
||||
label = "cfg"
|
||||
}
|
||||
}
|
||||
|
||||
image var.ext4 {
|
||||
empty = true
|
||||
temporary = true
|
||||
# 44M - 24k (GPT backup)
|
||||
size = 45032k
|
||||
|
||||
ext4 {
|
||||
label = "var"
|
||||
}
|
||||
}
|
||||
|
||||
image mmc.img {
|
||||
size = 512M
|
||||
hdimage {
|
||||
partition-table-type = "gpt"
|
||||
}
|
||||
|
||||
partition aux {
|
||||
offset = 2M
|
||||
image = "aux.ext4"
|
||||
}
|
||||
|
||||
partition primary {
|
||||
image = "rootfs.squashfs"
|
||||
size = 224M
|
||||
}
|
||||
|
||||
partition secondary {
|
||||
bootable = true
|
||||
image = "rootfs.squashfs"
|
||||
size = 224M
|
||||
}
|
||||
|
||||
partition cfg {
|
||||
image = "cfg.ext4"
|
||||
}
|
||||
|
||||
partition var {
|
||||
image = "var.ext4"
|
||||
}
|
||||
}
|
||||
|
||||
# Silence genimage warnings
|
||||
config {}
|
||||
@@ -7,6 +7,7 @@ image aux.ext4 {
|
||||
|
||||
ext4 {
|
||||
label = "aux"
|
||||
use-mke2fs = true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +18,7 @@ image cfg.ext4 {
|
||||
|
||||
ext4 {
|
||||
label = "cfg"
|
||||
use-mke2fs = true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,10 +29,11 @@ image var.ext4 {
|
||||
|
||||
ext4 {
|
||||
label = "var"
|
||||
use-mke2fs = true
|
||||
}
|
||||
}
|
||||
|
||||
image disk.img {
|
||||
image @DISKIMG@ {
|
||||
size = @TOTALSIZE@
|
||||
hdimage {
|
||||
partition-table-type = "gpt"
|
||||
|
||||
@@ -9,11 +9,20 @@ die()
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Find all matching key=value assignments in output/.config
|
||||
# E.g., load_cfg DISK_IMAGE sets the following variables:
|
||||
#
|
||||
# DISK_IMAGE=y
|
||||
# DISK_IMAGE_SIZE="512"
|
||||
# etc.
|
||||
#
|
||||
# shellcheck disable=SC1090
|
||||
load_cfg()
|
||||
{
|
||||
local tmp=$(mktemp -p /tmp)
|
||||
tmp=$(mktemp -p /tmp)
|
||||
|
||||
grep "$1" $BR2_CONFIG >$tmp
|
||||
. $tmp
|
||||
rm $tmp
|
||||
grep -E "${1}.*=" "$BR2_CONFIG" >"$tmp"
|
||||
. "$tmp"
|
||||
|
||||
rm "$tmp"
|
||||
}
|
||||
|
||||
@@ -123,10 +123,11 @@ tmp=$BUILD_DIR/genimage.tmp
|
||||
total=$((512 << M))
|
||||
bootoffs=$((32 << K))
|
||||
bootdata=
|
||||
diskimg=disk.img
|
||||
bootimg=
|
||||
bootpart=
|
||||
|
||||
while getopts "a:b:B:s:" opt; do
|
||||
while getopts "a:b:B:n:s:" opt; do
|
||||
case ${opt} in
|
||||
a)
|
||||
arch=$OPTARG
|
||||
@@ -137,6 +138,9 @@ while getopts "a:b:B:s:" opt; do
|
||||
B)
|
||||
bootoffs=$(($OPTARG))
|
||||
;;
|
||||
n)
|
||||
diskimg=${OPTARG}
|
||||
;;
|
||||
s)
|
||||
total=$(size2int $OPTARG)
|
||||
;;
|
||||
@@ -158,6 +162,7 @@ awk \
|
||||
-vimgsize=$imgsize \
|
||||
-vcfgsize=$cfgsize \
|
||||
-vvarsize=$varsize \
|
||||
-vdiskimg=$diskimg \
|
||||
-vbootimg="$bootimg" -vbootpart="$bootpart" \
|
||||
'{
|
||||
sub(/@TOTALSIZE@/, total);
|
||||
@@ -166,7 +171,7 @@ awk \
|
||||
sub(/@IMGSIZE@/, imgsize);
|
||||
sub(/@CFGSIZE@/, cfgsize);
|
||||
sub(/@VARSIZE@/, varsize);
|
||||
|
||||
sub(/@DISKIMG@/, diskimg);
|
||||
sub(/@BOOTIMG@/, bootimg);
|
||||
sub(/@BOOTPART@/, bootpart);
|
||||
}1' \
|
||||
|
||||
@@ -1,26 +1,66 @@
|
||||
#!/bin/sh
|
||||
# shellcheck disable=SC1091
|
||||
. "$TARGET_DIR/etc/os-release"
|
||||
|
||||
if [ -n "$INFIX_RELEASE" ]; then
|
||||
rel="-${INFIX_RELEASE}"
|
||||
fi
|
||||
|
||||
NM="${1:-custom}${rel}"
|
||||
RAM=${2:-512}
|
||||
IFNUM=${3:-1}
|
||||
ARCH=$1
|
||||
NM="${2:-custom}${rel}"
|
||||
DISK=$3
|
||||
RAM=${4:-512}
|
||||
IFNUM=${5:-1}
|
||||
|
||||
# The aarch64 build currently has no "loader" but instead starts Linux
|
||||
# directly, so we need to add a basic cmdline.
|
||||
loader_args()
|
||||
{
|
||||
if [ "$ARCH" = "aarch64" ]; then
|
||||
cat <<EOF
|
||||
"kernel_command_line": "console=ttyAMA0 root=PARTLABEL=primary quiet",
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
|
||||
loader_img()
|
||||
{
|
||||
if [ "$ARCH" = "x86_64" ]; then
|
||||
cat <<EOF
|
||||
"bios_image": "$loader",
|
||||
EOF
|
||||
else
|
||||
cat <<EOF
|
||||
"kernel_image": "$loader",
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
|
||||
if [ "$ARCH" = "x86_64" ]; then
|
||||
loader=OVMF.fd
|
||||
accel=allow
|
||||
opts=
|
||||
else
|
||||
loader=Image
|
||||
accel=disable
|
||||
opts="-M virt -cpu cortex-a72"
|
||||
fi
|
||||
|
||||
echo ">> Disk image MD5: $(md5sum "$BINARIES_DIR/$DISK" | awk '{print $1}')"
|
||||
|
||||
cat <<EOF >"$BINARIES_DIR/${NM}.gns3a"
|
||||
{
|
||||
"name": "$NM",
|
||||
"category": "router",
|
||||
"description": "Infix is a Network Operating System based on Linux. It can be set up both as a switch, with offloading using switchdev, and a router with firewalling.",
|
||||
"vendor_name": "KernelKit",
|
||||
"vendor_url": "https://github.com/kernelkit/",
|
||||
"product_name": "Infix",
|
||||
"description": "$INFIX_DESC",
|
||||
"vendor_name": "$VENDOR_NAME",
|
||||
"vendor_url": "$VENDOR_HOME",
|
||||
"product_name": "$NAME",
|
||||
"registry_version": 6,
|
||||
"status": "stable",
|
||||
"maintainer": "KernelKit",
|
||||
"maintainer_email": "kernelkit@googlegroups.com",
|
||||
"usage": "Default console login is 'root', no password. For remote login, default user/pass: admin/admin also works.\n\nType 'help' for an overview of commands and relevant configuration files.\n\nThe /etc directory is writable, use the passwd tool after login as part of your set up.\nFor networking, classify interfaces as switchports with /etc/mactab, syntax: 'MAC-address eN', where N is the port number (1-MAX).\nTo set up bridging and management interfaces, use /etc/network/interfaces, and /etc/network/interfaces.d/",
|
||||
"maintainer": "$VENDOR_NAME",
|
||||
"maintainer_email": "${SUPPORT_URL#mailto:}",
|
||||
"usage": "Default login, user/pass: admin/admin\n\nType 'help' for an overview of commands and relevant configuration files.\n\nFor Classic builds the following applies: the /etc directory is writable, use the passwd tool after login as part of your set up.\nFor networking, classify interfaces as switchports with /etc/mactab, syntax: 'MAC-address eN', where N is the port number (1-MAX).\nTo set up bridging and management interfaces, use /etc/network/interfaces, and /etc/network/interfaces.d/",
|
||||
"port_name_format": "eth{0}",
|
||||
"linked_clone": true,
|
||||
"qemu": {
|
||||
@@ -29,21 +69,24 @@ cat <<EOF >"$BINARIES_DIR/${NM}.gns3a"
|
||||
"ram": ${RAM},
|
||||
"cpus": 1,
|
||||
"hda_disk_interface": "virtio",
|
||||
"arch": "x86_64",
|
||||
"arch": "$ARCH",
|
||||
"console_type": "telnet",
|
||||
"kvm": "allow"
|
||||
$(loader_img)
|
||||
$(loader_args)
|
||||
"kvm": "$accel",
|
||||
"options": "$opts"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "OVMF.fd",
|
||||
"filesize": $(stat --printf='%s' "$BINARIES_DIR/OVMF.fd"),
|
||||
"md5sum": "$(md5sum "$BINARIES_DIR/OVMF.fd" | awk '{print $1}')",
|
||||
"filename": "$loader",
|
||||
"filesize": $(stat --printf='%s' "$BINARIES_DIR/$loader"),
|
||||
"md5sum": "$(md5sum "$BINARIES_DIR/$loader" | awk '{print $1}')",
|
||||
"version": "0.0"
|
||||
},
|
||||
{
|
||||
"filename": "disk.img",
|
||||
"filesize": $(stat --printf='%s' "$BINARIES_DIR/disk.img"),
|
||||
"md5sum": "$(md5sum "$BINARIES_DIR/disk.img" | awk '{print $1}')",
|
||||
"filename": "$DISK",
|
||||
"filesize": $(stat --printf='%s' "$BINARIES_DIR/$DISK"),
|
||||
"md5sum": "$(md5sum "$BINARIES_DIR/$DISK" | awk '{print $1}')",
|
||||
"version": "0.0"
|
||||
}
|
||||
],
|
||||
@@ -51,8 +94,8 @@ cat <<EOF >"$BINARIES_DIR/${NM}.gns3a"
|
||||
{
|
||||
"name": "0.0",
|
||||
"images": {
|
||||
"bios_image": "OVMF.fd",
|
||||
"hda_disk_image": "disk.img"
|
||||
$(loader_img)
|
||||
"hda_disk_image": "$DISK"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -7,19 +7,39 @@ if [ -n "${ID_LIKE}" ]; then
|
||||
ID="${ID} ${ID_LIKE}"
|
||||
fi
|
||||
|
||||
GIT_VERSION=$(git -C "$BR2_EXTERNAL_INFIX_PATH" describe --always --dirty --tags)
|
||||
if [ -z "$GIT_VERSION" ]; then
|
||||
infix_path="$BR2_EXTERNAL_INFIX_PATH"
|
||||
if [ -n "$INFIX_OEM_PATH" ]; then
|
||||
# Use version from br2-external OEM:ing Infix
|
||||
infix_path="$INFIX_OEM_PATH"
|
||||
fi
|
||||
GIT_VERSION=$(git -C "$infix_path" describe --always --dirty --tags)
|
||||
fi
|
||||
|
||||
# Override VERSION in /etc/os-release and filenames for release builds
|
||||
if [ -n "$INFIX_RELEASE" ]; then
|
||||
VERSION="$INFIX_RELEASE"
|
||||
else
|
||||
VERSION=$GIT_VERSION
|
||||
fi
|
||||
|
||||
# This is a symlink to /usr/lib/os-release, so we remove this to keep
|
||||
# original Buildroot information.
|
||||
rm -f "$TARGET_DIR/etc/os-release"
|
||||
{
|
||||
echo "NAME=\"Infix\""
|
||||
echo "VERSION=${GIT_VERSION}"
|
||||
echo "ID=infix"
|
||||
echo "NAME=\"$INFIX_NAME\""
|
||||
echo "ID=$INFIX_ID"
|
||||
echo "PRETTY_NAME=\"$INFIX_TAGLINE $VERSION\""
|
||||
echo "ID_LIKE=\"${ID}\""
|
||||
echo "VERSION_ID=${GIT_VERSION}"
|
||||
echo "BUILD_ID=\"${NAME} ${VERSION}\""
|
||||
echo "PRETTY_NAME=\"Infix by KernelKit\""
|
||||
echo "VERSION=\"${VERSION}\""
|
||||
echo "VERSION_ID=${VERSION}"
|
||||
echo "BUILD_ID=\"${GIT_VERSION}\""
|
||||
if [ -n "$INFIX_IMAGE_ID" ]; then
|
||||
echo "IMAGE_ID=\"$INFIX_IMAGE_ID\""
|
||||
fi
|
||||
if [ -n "$INFIX_RELEASE" ]; then
|
||||
echo "IMAGE_VERSION=\"$INFIX_RELEASE\""
|
||||
fi
|
||||
if [ "$INFIX_VARIANT_NETCONF" = "y" ]; then
|
||||
echo "VARIANT=\"Managed NETCONF\""
|
||||
echo "VARIANT_ID=netconf"
|
||||
@@ -28,11 +48,25 @@ rm -f "$TARGET_DIR/etc/os-release"
|
||||
echo "VARIANT_ID=classic"
|
||||
fi
|
||||
echo "ARCHITECTURE=\"${INFIX_ARCH}\""
|
||||
echo "HOME_URL=https://github.com/KernelKit"
|
||||
echo "HOME_URL=$INFIX_HOME"
|
||||
if [ -n "$INFIX_VENDOR" ]; then
|
||||
echo "VENDOR_NAME=\"$INFIX_VENDOR\""
|
||||
fi
|
||||
if [ -n "$INFIX_VENDOR_HOME" ]; then
|
||||
echo "VENDOR_HOME=\"$INFIX_VENDOR_HOME\""
|
||||
fi
|
||||
if [ -n "$INFIX_DOC" ]; then
|
||||
echo "DOCUMENTATION_URL=\"$INFIX_DOC\""
|
||||
fi
|
||||
if [ -n "$INFIX_SUPPORT" ]; then
|
||||
echo "SUPPORT_URL=\"$INFIX_SUPPORT\""
|
||||
fi
|
||||
if [ -n "$INFIX_DESC" ]; then
|
||||
echo "INFIX_DESC=\"$INFIX_DESC\""
|
||||
fi
|
||||
} > "$TARGET_DIR/etc/os-release"
|
||||
|
||||
|
||||
echo "Infix by KernelKit $GIT_VERSION -- $(date +"%b %e %H:%M %Z %Y")" > "$TARGET_DIR/etc/version"
|
||||
echo "$INFIX_TAGLINE $VERSION -- $(date +"%b %e %H:%M %Z %Y")" > "$TARGET_DIR/etc/version"
|
||||
|
||||
# Allow pdmenu (setup) and bash to be login shells, bash is added
|
||||
# automatically when selected in menuyconfig, but not when BusyBox
|
||||
@@ -46,13 +80,3 @@ grep -qsE '^/bin/true$$' "$TARGET_DIR/etc/shells" \
|
||||
|| echo "/bin/true" >> "$TARGET_DIR/etc/shells"
|
||||
grep -qsE '^/bin/false$$' "$TARGET_DIR/etc/shells" \
|
||||
|| echo "/bin/false" >> "$TARGET_DIR/etc/shells"
|
||||
|
||||
# Menuconfig support for modifying Qemu args in release tarballs
|
||||
cp "$BR2_EXTERNAL_INFIX_PATH/board/common/qemu/qemu.sh" "$BINARIES_DIR/"
|
||||
sed "s/default QEMU_aarch64/default QEMU_$BR2_ARCH/" \
|
||||
< "$BR2_EXTERNAL_INFIX_PATH/board/common/qemu/Config.in" \
|
||||
> "$BINARIES_DIR/Config.in"
|
||||
rm -f "$BINARIES_DIR/qemu.cfg"
|
||||
CONFIG_="CONFIG_" BR2_CONFIG="$BINARIES_DIR/qemu.cfg" \
|
||||
"$O/build/buildroot-config/conf" --olddefconfig "$BINARIES_DIR/Config.in"
|
||||
rm -f "$BINARIES_DIR/qemu.cfg.old" "$BINARIES_DIR/.config.old"
|
||||
|
||||
@@ -1,12 +1,23 @@
|
||||
#!/bin/sh
|
||||
common=$(dirname "$(readlink -f "$0")")
|
||||
. $common/lib.sh
|
||||
# shellcheck disable=SC2086
|
||||
|
||||
common=$(dirname "$(readlink -f "$0")")
|
||||
. "$common/lib.sh"
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
. "$TARGET_DIR/etc/os-release"
|
||||
|
||||
load_cfg INFIX_ID
|
||||
load_cfg BR2_ARCH
|
||||
load_cfg BR2_DEFCONFIG
|
||||
load_cfg BR2_EXTERNAL_INFIX_PATH
|
||||
load_cfg BR2_TARGET_ROOTFS
|
||||
NAME=infix-$(basename "$BR2_DEFCONFIG" _defconfig | tr _ - | sed 's/x86-64/x86_64/')
|
||||
if [ -n "$IMAGE_ID" ]; then
|
||||
NAME="$IMAGE_ID"
|
||||
else
|
||||
NAME="$INFIX_ID"-$(echo "$BR2_ARCH" | tr _ - | sed 's/x86-64/x86_64/')
|
||||
fi
|
||||
diskimg=disk.img
|
||||
|
||||
ver()
|
||||
{
|
||||
@@ -31,7 +42,7 @@ fi
|
||||
load_cfg DISK_IMAGE
|
||||
if [ "$DISK_IMAGE" = "y" ]; then
|
||||
ixmsg "Creating Disk Image"
|
||||
|
||||
diskimg="${NAME}-disk.img"
|
||||
bootcfg=
|
||||
if [ "$DISK_IMAGE_BOOT_DATA" ]; then
|
||||
bootcfg="-b $DISK_IMAGE_BOOT_DATA -B $DISK_IMAGE_BOOT_OFFSET"
|
||||
@@ -44,16 +55,15 @@ if [ "$DISK_IMAGE" = "y" ]; then
|
||||
[ -f "$archive" ] || wget -O"$archive" "$DISK_IMAGE_RELEASE_URL"
|
||||
tar -xa --strip-components=1 -C "$BINARIES_DIR" -f "$archive"
|
||||
fi
|
||||
|
||||
$common/mkrauc-status.sh "$BINARIES_DIR/${NAME}.pkg" >"$BINARIES_DIR/rauc.status"
|
||||
$common/mkdisk.sh -a $BR2_ARCH -s $DISK_IMAGE_SIZE $bootcfg
|
||||
$common/mkdisk.sh -a $BR2_ARCH -n $diskimg -s $DISK_IMAGE_SIZE $bootcfg
|
||||
fi
|
||||
|
||||
load_cfg GNS3_APPLIANCE
|
||||
if [ "$GNS3_APPLIANCE" = "y" ]; then
|
||||
load_cfg GNS3_APPLIANCE_RAM
|
||||
load_cfg GNS3_APPLIANCE_IFNUM
|
||||
ixmsg "Creating GNS3 Appliance, $GNS3_APPLIANCE_RAM MiB with $GNS3_APPLIANCE_IFNUM ports"
|
||||
$common/mkgns3a.sh $NAME $GNS3_APPLIANCE_RAM $GNS3_APPLIANCE_IFNUM
|
||||
$common/mkgns3a.sh $BR2_ARCH $NAME $diskimg $GNS3_APPLIANCE_RAM $GNS3_APPLIANCE_IFNUM
|
||||
fi
|
||||
|
||||
load_cfg FIT_IMAGE
|
||||
@@ -63,13 +73,21 @@ if [ "$FIT_IMAGE" = "y" ]; then
|
||||
fi
|
||||
|
||||
if [ "$BR2_TARGET_ROOTFS_SQUASHFS" = "y" ]; then
|
||||
if [ -z "${NAME##*minimal*}" ]; then
|
||||
NAME=$(echo "$NAME" | sed 's/-minimal//')
|
||||
fi
|
||||
|
||||
rel=$(ver)
|
||||
ln -sf rootfs.squashfs "$BINARIES_DIR/${NAME}${rel}.img"
|
||||
if [ -n "$rel" ]; then
|
||||
ln -sf "$BINARIES_DIR/${NAME}${rel}.img" "$BINARIES_DIR/${NAME}.img"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Menuconfig support for modifying Qemu args in release tarballs
|
||||
cp "$BR2_EXTERNAL_INFIX_PATH/board/common/rootfs/bin/onieprom" "$BINARIES_DIR/"
|
||||
cp "$BR2_EXTERNAL_INFIX_PATH/board/common/qemu/qemu.sh" "$BINARIES_DIR/"
|
||||
sed -e "s/@ARCH@/QEMU_$BR2_ARCH/" \
|
||||
-e "s/@DISK_IMG@/$diskimg/" \
|
||||
< "$BR2_EXTERNAL_INFIX_PATH/board/common/qemu/Config.in.in" \
|
||||
> "$BINARIES_DIR/Config.in"
|
||||
rm -f "$BINARIES_DIR/qemu.cfg"
|
||||
CONFIG_="CONFIG_" BR2_CONFIG="$BINARIES_DIR/qemu.cfg" \
|
||||
"$O/build/buildroot-config/conf" --olddefconfig "$BINARIES_DIR/Config.in"
|
||||
rm -f "$BINARIES_DIR/qemu.cfg.old" "$BINARIES_DIR/.config.old"
|
||||
|
||||
@@ -2,7 +2,7 @@ mainmenu "QEMU Virtualization"
|
||||
|
||||
choice
|
||||
prompt "Target Architecture"
|
||||
default QEMU_aarch64
|
||||
default @ARCH@
|
||||
|
||||
config QEMU_x86_64
|
||||
bool "x86_64"
|
||||
@@ -62,9 +62,24 @@ config QEMU_CONSOLE_SERIAL
|
||||
endchoice
|
||||
|
||||
config QEMU_MACHINE
|
||||
string
|
||||
default "qemu-system-aarch64 -M virt -cpu cortex-a72 -m 256M" if QEMU_aarch64
|
||||
default "qemu-system-x86_64 -M q35,accel=kvm -cpu host -m 512M" if QEMU_x86_64
|
||||
string "Select emulated machine"
|
||||
default "qemu-system-aarch64 -M virt -cpu cortex-a72" if QEMU_aarch64
|
||||
default "qemu-system-x86_64 -M q35,accel=kvm -cpu host" if QEMU_x86_64
|
||||
help
|
||||
You should not have to change this setting, although you may
|
||||
want to tweak it, or change the acceleration.
|
||||
|
||||
The default is based on the Buildroot architecture, selected by
|
||||
the defconfig you started with. Currently Infix supports only
|
||||
aarch64 (ARM64) and x86_64 (AMD64).
|
||||
|
||||
config QEMU_MACHINE_RAM
|
||||
string "RAM size (k/M/G)"
|
||||
default "256M"
|
||||
help
|
||||
The default, 255 MiB, works for most configurations, even less for
|
||||
the Infix Classic builds. However, if you get kernel panic with:
|
||||
"System is deadlocked on memory", try increasing this one.
|
||||
|
||||
config QEMU_KERNEL
|
||||
string
|
||||
@@ -80,7 +95,7 @@ config QEMU_BIOS
|
||||
|
||||
config QEMU_ROOTFS
|
||||
string
|
||||
default "disk.img" if !QEMU_ROOTFS_INITRD
|
||||
default "@DISK_IMG@" if !QEMU_ROOTFS_INITRD
|
||||
default "rootfs.squashfs" if QEMU_ROOTFS_INITRD
|
||||
|
||||
config QEMU_DTB_EXTEND
|
||||
@@ -103,6 +118,9 @@ config QEMU_RW_VAR
|
||||
default "var.ext4"
|
||||
endif
|
||||
|
||||
config QEMU_VPD
|
||||
bool "Emulate a Vital Product Data (VPD) Memory"
|
||||
|
||||
config QEMU_HOST
|
||||
string "Export host filesystem path"
|
||||
default "/tmp"
|
||||
@@ -137,6 +155,10 @@ endchoice
|
||||
config QEMU_NET_MODEL
|
||||
string "Interface model"
|
||||
default "virtio-net-pci"
|
||||
help
|
||||
The default, virtio-net-pci, NIC works for most use-cases, but
|
||||
if you want to play with low-level stuff like ethtool, you
|
||||
might want to test the Intel 82545EM driver, e1000.
|
||||
|
||||
config QEMU_NET_BRIDGE_DEV
|
||||
string "Bridge device"
|
||||
@@ -19,6 +19,7 @@
|
||||
#
|
||||
|
||||
# Local variables
|
||||
imgdir=$(readlink -f $(dirname "$0"))
|
||||
prognm=$(basename "$0")
|
||||
|
||||
usage()
|
||||
@@ -169,7 +170,7 @@ net_dev_args()
|
||||
net_args()
|
||||
{
|
||||
# Infix will pick up this file via fwcfg and install it to /etc
|
||||
mactab=$(dirname "$CONFIG_QEMU_ROOTFS")/mactab
|
||||
mactab=${imgdir}/mactab
|
||||
:> "$mactab"
|
||||
echo -n "-fw_cfg name=opt/mactab,file=$mactab "
|
||||
|
||||
@@ -192,6 +193,34 @@ net_args()
|
||||
fi
|
||||
}
|
||||
|
||||
# Vital Product data
|
||||
vpd_args()
|
||||
{
|
||||
[ "$CONFIG_QEMU_VPD" = "y" ] || return
|
||||
|
||||
vpd_file="${imgdir}/vpd"
|
||||
|
||||
if ! [ -f "$vpd_file" ]; then
|
||||
onieprom="${imgdir}/onieprom"
|
||||
|
||||
# This is you QEMU factory/default password:
|
||||
pwhash=$(echo -n "admin" | mkpasswd -s -m sha256crypt)
|
||||
|
||||
cat <<EOF | "$onieprom" -e >"$vpd_file"
|
||||
{
|
||||
"manufacture-date": "$(date +"%d/%m/%Y %H:%M:%S")",
|
||||
"vendor-extension": [
|
||||
[
|
||||
61046,
|
||||
"{\"pwhash\":\"$pwhash\"}"
|
||||
]
|
||||
]
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
echo -n "-fw_cfg name=opt/vpd,file=$vpd_file"
|
||||
}
|
||||
|
||||
wdt_args()
|
||||
{
|
||||
echo -n "-device i6300esb -rtc clock=host"
|
||||
@@ -201,7 +230,7 @@ run_qemu()
|
||||
{
|
||||
local qemu
|
||||
read qemu <<EOF
|
||||
$CONFIG_QEMU_MACHINE \
|
||||
$CONFIG_QEMU_MACHINE -m $CONFIG_QEMU_MACHINE_RAM \
|
||||
$(loader_args) \
|
||||
$(rootfs_args) \
|
||||
$(serial_args) \
|
||||
@@ -209,6 +238,7 @@ run_qemu()
|
||||
$(host_args) \
|
||||
$(net_args) \
|
||||
$(wdt_args) \
|
||||
$(vpd_args) \
|
||||
$CONFIG_QEMU_EXTRA
|
||||
EOF
|
||||
|
||||
|
||||
@@ -0,0 +1,218 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import binascii
|
||||
import struct
|
||||
|
||||
HDRMGC = b"TlvInfo"
|
||||
HDRVER = 1
|
||||
HDRFMT = ">7sxBH"
|
||||
HDRLEN = struct.calcsize(HDRFMT)
|
||||
|
||||
CRCFMT = ">BBL"
|
||||
CRCLEN = struct.calcsize(CRCFMT)
|
||||
|
||||
def pack_varstr(s, maxlen=0xff):
|
||||
b = bytes(s, "ascii")
|
||||
assert(len(b) <= maxlen)
|
||||
return b
|
||||
|
||||
def unpack_varstr(b):
|
||||
return b.decode("ascii")
|
||||
|
||||
|
||||
def pack_u8(num):
|
||||
return struct.pack("B", num)
|
||||
|
||||
def unpack_u8(b):
|
||||
return struct.unpack("B", b)[0]
|
||||
|
||||
|
||||
def pack_u16(num):
|
||||
return struct.pack(">H", num)
|
||||
|
||||
def unpack_u16(b):
|
||||
return struct.unpack(">H", b)[0]
|
||||
|
||||
|
||||
def pack_u32(num):
|
||||
return struct.pack(">L", num)
|
||||
|
||||
def unpack_u32(b):
|
||||
return struct.unpack(">L", b)[0]
|
||||
|
||||
|
||||
def pack_date(datestr):
|
||||
assert(len(datestr) == 19)
|
||||
return pack_varstr(datestr, 19)
|
||||
|
||||
def pack_country(cstr):
|
||||
assert(len(cstr) == 2)
|
||||
return pack_varstr(cstr, 2)
|
||||
|
||||
def pack_mac(macstr):
|
||||
return struct.pack("6B", *[int(o, 16) for o in macstr.split(":")])
|
||||
|
||||
def unpack_mac(b):
|
||||
o = struct.unpack("6B", b)
|
||||
return f"{o[0]:02x}:{o[1]:02x}:{o[2]:02x}:{o[3]:02x}:{o[4]:02x}:{o[5]:02x}"
|
||||
|
||||
OPS = {
|
||||
"varstr": (pack_varstr, unpack_varstr),
|
||||
"u8": (pack_u8, unpack_u8),
|
||||
"u16": (pack_u16, unpack_u16),
|
||||
"u32": (pack_u32, unpack_u32),
|
||||
|
||||
"date": (pack_date, unpack_varstr),
|
||||
"country": (pack_country, unpack_varstr),
|
||||
"mac": (pack_mac, unpack_mac),
|
||||
}
|
||||
|
||||
TLV = (
|
||||
{ "type": 0x21, "name": "product-name", "ops": "varstr" },
|
||||
{ "type": 0x22, "name": "part-number", "ops": "varstr" },
|
||||
{ "type": 0x23, "name": "serial-number", "ops": "varstr" },
|
||||
{ "type": 0x24, "name": "mac-address", "ops": "mac" },
|
||||
{ "type": 0x25, "name": "manufacture-date", "ops": "date" },
|
||||
{ "type": 0x26, "name": "device-version", "ops": "u8" },
|
||||
{ "type": 0x27, "name": "label-revision", "ops": "varstr" },
|
||||
{ "type": 0x28, "name": "platform-name", "ops": "varstr" },
|
||||
{ "type": 0x29, "name": "onie-version", "ops": "varstr" },
|
||||
{ "type": 0x2a, "name": "num-macs", "ops": "u16" },
|
||||
{ "type": 0x2b, "name": "manufacturer", "ops": "varstr" },
|
||||
{ "type": 0x2c, "name": "country-code", "ops": "country" },
|
||||
{ "type": 0x2d, "name": "vendor", "ops": "varstr" },
|
||||
{ "type": 0x2e, "name": "diag-version", "ops": "varstr" },
|
||||
{ "type": 0x2f, "name": "service-tag", "ops": "varstr" },
|
||||
)
|
||||
|
||||
TLV_VENDOR_EXTENSION = 0xfd
|
||||
TLV_CRC32 = 0xfe
|
||||
|
||||
def _tlv_by_lambda(fn):
|
||||
info = next(filter(fn, TLV))
|
||||
if "ops" in info:
|
||||
return info, OPS[info["ops"]]
|
||||
else:
|
||||
return info
|
||||
|
||||
def tlv_by_name(name):
|
||||
try:
|
||||
return _tlv_by_lambda(lambda info: info["name"] == name)
|
||||
except StopIteration:
|
||||
raise ValueError(f"Unknown type name \"{name}\"")
|
||||
|
||||
def tlv_by_type(t):
|
||||
try:
|
||||
return _tlv_by_lambda(lambda info: info["type"] == t)
|
||||
except StopIteration:
|
||||
raise ValueError(f"Unknown type id {t}")
|
||||
|
||||
def into_tlv(d):
|
||||
def pack_vendor(exts):
|
||||
out = b""
|
||||
for (iana_pen, val) in exts:
|
||||
b = bytes(val, "utf-8")
|
||||
l = len(b) + struct.calcsize(">L")
|
||||
assert(l <= 0xff)
|
||||
out += struct.pack(">BBL", TLV_VENDOR_EXTENSION, l, iana_pen) + b
|
||||
|
||||
return out
|
||||
|
||||
out = b""
|
||||
|
||||
# Generate all optional data
|
||||
for (k, v) in sorted(d.items()):
|
||||
if k == "vendor-extension":
|
||||
out += pack_vendor(v)
|
||||
else:
|
||||
info, (pack, _) = tlv_by_name(k)
|
||||
val = pack(v)
|
||||
out += struct.pack("BB", info["type"], len(val)) + val
|
||||
|
||||
# Prepend the header now that we know the total length of the
|
||||
# optional fields - make sure sure to include the CRC TLV length,
|
||||
# which is appended in the last step
|
||||
out = struct.pack(HDRFMT, HDRMGC, HDRVER, len(out) + CRCLEN) + out
|
||||
|
||||
out += struct.pack("BB", TLV_CRC32, struct.calcsize(">L"))
|
||||
out += struct.pack(">L", binascii.crc32(out))
|
||||
return out
|
||||
|
||||
def from_tlv(f):
|
||||
d = {}
|
||||
|
||||
def unpack_vendor(ext):
|
||||
head, tail = ext[:4], ext[4:]
|
||||
iana_pen = struct.unpack(">L", head)[0]
|
||||
val = tail.decode("utf-8")
|
||||
|
||||
if "vendor-extension" not in d:
|
||||
d["vendor-extension"] = []
|
||||
|
||||
d["vendor-extension"].append([iana_pen, val])
|
||||
|
||||
head = f.read(HDRLEN)
|
||||
magic, ver, l = struct.unpack(HDRFMT, head)
|
||||
assert(magic == HDRMGC)
|
||||
assert(ver == 1)
|
||||
|
||||
tail = f.read(l)
|
||||
b = head + tail
|
||||
assert(len(b) >= HDRLEN + l)
|
||||
|
||||
crcoffs = HDRLEN + l - CRCLEN
|
||||
t, l, v = struct.unpack(CRCFMT, b[crcoffs:crcoffs+CRCLEN])
|
||||
assert(t == TLV_CRC32)
|
||||
assert(v == binascii.crc32(b[:crcoffs + struct.calcsize("BB")]))
|
||||
|
||||
while len(tail) >= 2:
|
||||
t, l = struct.unpack("BB", tail[:2])
|
||||
v = tail[2:l+2]
|
||||
tail = tail[l+2:]
|
||||
|
||||
if t == TLV_VENDOR_EXTENSION:
|
||||
unpack_vendor(v)
|
||||
continue
|
||||
elif t == TLV_CRC32:
|
||||
break
|
||||
|
||||
info, (_, unpack) = tlv_by_type(t)
|
||||
d[info["name"]] = unpack(v)
|
||||
|
||||
return d
|
||||
|
||||
if __name__ == "__main__":
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
|
||||
parser = argparse.ArgumentParser(prog='onieprom')
|
||||
|
||||
parser.add_argument("infile", nargs="?", default=sys.stdin, type=argparse.FileType("rb", 0))
|
||||
parser.add_argument("outfile", nargs="?", default=sys.stdout, type=argparse.FileType("wb"))
|
||||
|
||||
parser.add_argument("-e", "--encode", default=False, action="store_true",
|
||||
help="Encode JSON input to binary output")
|
||||
|
||||
parser.add_argument("-d", "--decode", default=False, action="store_true",
|
||||
help="Decode binary input to JSON output")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if (not args.encode) and (not args.decode):
|
||||
c = args.infile.read(1)
|
||||
args.infile.seek(0, 0)
|
||||
|
||||
if c == b"{":
|
||||
args.encode = True
|
||||
elif c == b"T":
|
||||
args.decode = True
|
||||
else:
|
||||
sys.stderr.write("Neither encode nor decode specified, and could not infer operation from input")
|
||||
sys.exit(1)
|
||||
|
||||
if args.encode:
|
||||
args.outfile.buffer.write(into_tlv(json.load(args.infile)))
|
||||
else:
|
||||
args.outfile.write(json.dumps(from_tlv(args.infile)))
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
Q=$@
|
||||
|
||||
/bin/echo -n "$Q, are you sure (y/N)? "
|
||||
read -n1 yorn
|
||||
echo
|
||||
|
||||
if [ x$yorn != "xy" ] && [ x$yorn != "xY" ]; then
|
||||
echo "OK, aborting."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,88 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This file is part of avahi.
|
||||
#
|
||||
# avahi is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser General Public License as
|
||||
# published by the Free Software Foundation; either version 2 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# avahi is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
# License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with avahi; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
# USA.
|
||||
|
||||
set -e
|
||||
|
||||
# Command line arguments:
|
||||
# $1 event that happened:
|
||||
# BIND: Successfully claimed address
|
||||
# CONFLICT: An IP address conflict happened
|
||||
# UNBIND: The IP address is no longer needed
|
||||
# STOP: The daemon is terminating
|
||||
# $2 interface name
|
||||
# $3 IP adddress
|
||||
|
||||
PATH="$PATH:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
|
||||
# Use a different metric for each interface, so that we can set
|
||||
# identical routes to multiple interfaces.
|
||||
|
||||
METRIC=$((1000 + `cat "/sys/class/net/$2/ifindex" 2>/dev/null || echo 0`))
|
||||
|
||||
if [ -x /bin/ip -o -x /sbin/ip ] ; then
|
||||
|
||||
# We have the Linux ip tool from the iproute package
|
||||
|
||||
case "$1" in
|
||||
BIND)
|
||||
ip addr flush dev "$2" label "$2:avahi"
|
||||
ip addr add "$3"/16 brd 169.254.255.255 label "$2:avahi" scope link dev "$2" proto 6
|
||||
ip route add default dev "$2" metric "$METRIC" scope link ||:
|
||||
;;
|
||||
|
||||
CONFLICT|UNBIND|STOP)
|
||||
ip route del default dev "$2" metric "$METRIC" scope link ||:
|
||||
ip addr del "$3"/16 brd 169.254.255.255 label "$2:avahi" scope link dev "$2"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Unknown event $1" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
elif [ -x /bin/ifconfig -o -x /sbin/ifconfig ] ; then
|
||||
|
||||
# We have the old ifconfig tool
|
||||
|
||||
case "$1" in
|
||||
BIND)
|
||||
ifconfig "$2:avahi" inet "$3" netmask 255.255.0.0 broadcast 169.254.255.255 up
|
||||
route add default dev "$2:avahi" metric "$METRIC" ||:
|
||||
;;
|
||||
|
||||
CONFLICT|STOP|UNBIND)
|
||||
route del default dev "$2:avahi" metric "$METRIC" ||:
|
||||
ifconfig "$2:avahi" down
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Unknown event $1" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
else
|
||||
|
||||
echo "No network configuration tool found." >&2
|
||||
exit 1
|
||||
|
||||
fi
|
||||
|
||||
exit 0
|
||||
@@ -1,141 +0,0 @@
|
||||
_cond()
|
||||
{
|
||||
initctl -pt cond dump | awk '{print $4}' | sed 's/<\(.*\)>/\1/'
|
||||
}
|
||||
|
||||
_ident()
|
||||
{
|
||||
if [ -n "$1" ]; then
|
||||
initctl ident | grep -q $1
|
||||
else
|
||||
initctl ident
|
||||
fi
|
||||
}
|
||||
|
||||
_svc()
|
||||
{
|
||||
initctl ls -pt | grep $1 | sed "s/.*\/\(.*\)/\1/g" | sort -u
|
||||
}
|
||||
|
||||
_enabled()
|
||||
{
|
||||
echo "$(_svc enabled)"
|
||||
}
|
||||
|
||||
_available()
|
||||
{
|
||||
all=$(mktemp)
|
||||
ena=$(mktemp)
|
||||
echo "$(_svc available)" >$all
|
||||
echo "$(_svc enabled)" >$ena
|
||||
grep -v -f $ena $all
|
||||
rm $all $ena
|
||||
}
|
||||
|
||||
# Determine first non-option word. Usually the command
|
||||
_firstword() {
|
||||
local firstword i
|
||||
|
||||
firstword=
|
||||
for ((i = 1; i < ${#COMP_WORDS[@]}; ++i)); do
|
||||
if [[ ${COMP_WORDS[i]} != -* ]]; then
|
||||
firstword=${COMP_WORDS[i]}
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
echo $firstword
|
||||
}
|
||||
|
||||
# Determine last non-option word. Uusally a sub-command
|
||||
_lastword() {
|
||||
local lastword i
|
||||
|
||||
lastword=
|
||||
for ((i = 1; i < ${#COMP_WORDS[@]}; ++i)); do
|
||||
if [[ ${COMP_WORDS[i]} != -* ]] && [[ -n ${COMP_WORDS[i]} ]] && [[ ${COMP_WORDS[i]} != $cur ]]; then
|
||||
lastword=${COMP_WORDS[i]}
|
||||
fi
|
||||
done
|
||||
|
||||
echo $lastword
|
||||
}
|
||||
|
||||
_initctl()
|
||||
{
|
||||
local cur command
|
||||
|
||||
cur=${COMP_WORDS[COMP_CWORD]}
|
||||
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||
firstword=$(_firstword)
|
||||
lastword=$(_lastword)
|
||||
|
||||
commands="status cond debug help kill ls log version list enable \
|
||||
disable touch show cat edit create delete reload start \
|
||||
stop restart signal cgroup ps top plugins runlevel reboot \
|
||||
halt poweroff suspend utmp"
|
||||
cond_cmds="set get clear status dump"
|
||||
cond_types="hook net pid service task usr"
|
||||
signals="int term hup stop tstp cont usr1 usr2 pwr"
|
||||
options="-b --batch \
|
||||
-c --create \
|
||||
-d --debug \
|
||||
-f --force \
|
||||
-h --help \
|
||||
-j --json \
|
||||
-n --noerr \
|
||||
-1 --once \
|
||||
-p --plain \
|
||||
-q --quiet \
|
||||
-t --no-heading \
|
||||
-v --verbose \
|
||||
-V --version"
|
||||
|
||||
case "${firstword}" in
|
||||
enable)
|
||||
COMPREPLY=($(compgen -W "$(_available)" -- $cur))
|
||||
;;
|
||||
disable|touch)
|
||||
COMPREPLY=($(compgen -W "$(_enabled)" -- $cur))
|
||||
;;
|
||||
show|cat|edit|delete)
|
||||
COMPREPLY=($(compgen -W "$(_svc .)" -- $cur))
|
||||
;;
|
||||
start|stop|restart|log|status)
|
||||
COMPREPLY=($(compgen -W "$(_ident)" -- $cur))
|
||||
;;
|
||||
signal|kill)
|
||||
if $(_ident "${prev}"); then
|
||||
COMPREPLY=($(compgen -W "$signals" -- $cur))
|
||||
else
|
||||
COMPREPLY=($(compgen -W "$(_ident)" -- $cur))
|
||||
fi
|
||||
;;
|
||||
cond)
|
||||
case "${lastword}" in
|
||||
set|clear)
|
||||
compopt -o nospace
|
||||
COMPREPLY=($(compgen -W "usr/" -- $cur))
|
||||
;;
|
||||
get)
|
||||
COMPREPLY=($(compgen -W "$(_cond)" -- $cur))
|
||||
;;
|
||||
dump)
|
||||
COMPREPLY=($(compgen -W "$cond_types" -- $cur))
|
||||
;;
|
||||
*)
|
||||
COMPREPLY=($(compgen -W "$cond_cmds" -- $cur))
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
COMPREPLY=($(compgen -W "$commands" -- $cur))
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ $cur == -* ]]; then
|
||||
COMPREPLY=($(compgen -W "$options" -- $cur))
|
||||
fi
|
||||
}
|
||||
|
||||
complete -F _initctl initctl
|
||||
@@ -1,2 +1,3 @@
|
||||
run [S] /lib/infix/sysctl-sync-ip-conf --
|
||||
run [S] /lib/infix/nameif -- Probing network interfaces
|
||||
run [S] log:console /lib/infix/probe -- Probing system information
|
||||
run [S] <pid/syslogd> /lib/infix/sysctl-sync-ip-conf --
|
||||
run [S] <pid/syslogd> /lib/infix/nameif -- Probing network interfaces
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
service [2345789] log:prio:user.notice rauc service -- Software update service
|
||||
set G_MESSAGES_DEBUG=nocolor
|
||||
service [2345789] <service/dbus/running> \
|
||||
env:-/etc/default/rauc log:prio:user.notice \
|
||||
rauc service $RAUC_ARGS -- Software update service
|
||||
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
task [S] /lib/infix/ssh-hostkeys --
|
||||
service [2345789] <usr/ssh-hostkeys> /usr/sbin/sshd -D -- OpenSSH daemon
|
||||
@@ -0,0 +1,5 @@
|
||||
# Override Finit plugin
|
||||
service cgroup.system name:dbus notify:none pid:!/run/messagebus.pid \
|
||||
[S123456789] <pid/syslogd> /usr/bin/dbus-daemon --nofork --system --syslog-only \
|
||||
-- D-Bus message bus daemon
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
4 static
|
||||
5 dhcp
|
||||
6 random
|
||||
@@ -1,122 +0,0 @@
|
||||
|
||||
#user nobody;
|
||||
worker_processes 1;
|
||||
|
||||
#error_log logs/error.log;
|
||||
#error_log logs/error.log notice;
|
||||
#error_log logs/error.log info;
|
||||
|
||||
#pid logs/nginx.pid;
|
||||
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
|
||||
http {
|
||||
include mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
# '$status $body_bytes_sent "$http_referer" '
|
||||
# '"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
#access_log logs/access.log main;
|
||||
|
||||
sendfile on;
|
||||
#tcp_nopush on;
|
||||
|
||||
#keepalive_timeout 0;
|
||||
keepalive_timeout 65;
|
||||
|
||||
#gzip on;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
#charset koi8-r;
|
||||
|
||||
#access_log logs/host.access.log main;
|
||||
|
||||
location / {
|
||||
root html;
|
||||
index index.html index.htm;
|
||||
}
|
||||
|
||||
location /restconf/ {
|
||||
fastcgi_pass unix:/var/run/clixon/restconf.sock;
|
||||
include fastcgi_params;
|
||||
}
|
||||
|
||||
#error_page 404 /404.html;
|
||||
|
||||
# redirect server error pages to the static page /50x.html
|
||||
#
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
location = /50x.html {
|
||||
root html;
|
||||
}
|
||||
|
||||
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
|
||||
#
|
||||
#location ~ \.php$ {
|
||||
# proxy_pass http://127.0.0.1;
|
||||
#}
|
||||
|
||||
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
|
||||
#
|
||||
#location ~ \.php$ {
|
||||
# root html;
|
||||
# fastcgi_pass 127.0.0.1:9000;
|
||||
# fastcgi_index index.php;
|
||||
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
|
||||
# include fastcgi_params;
|
||||
#}
|
||||
|
||||
# deny access to .htaccess files, if Apache's document root
|
||||
# concurs with nginx's one
|
||||
#
|
||||
#location ~ /\.ht {
|
||||
# deny all;
|
||||
#}
|
||||
}
|
||||
|
||||
|
||||
# another virtual host using mix of IP-, name-, and port-based configuration
|
||||
#
|
||||
#server {
|
||||
# listen 8000;
|
||||
# listen somename:8080;
|
||||
# server_name somename alias another.alias;
|
||||
|
||||
# location / {
|
||||
# root html;
|
||||
# index index.html index.htm;
|
||||
# }
|
||||
#}
|
||||
|
||||
|
||||
# HTTPS server
|
||||
#
|
||||
#server {
|
||||
# listen 443 ssl;
|
||||
# server_name localhost;
|
||||
|
||||
# ssl_certificate cert.pem;
|
||||
# ssl_certificate_key cert.key;
|
||||
|
||||
# ssl_session_cache shared:SSL:1m;
|
||||
# ssl_session_timeout 5m;
|
||||
|
||||
# ssl_ciphers HIGH:!aNULL:!MD5;
|
||||
# ssl_prefer_server_ciphers on;
|
||||
|
||||
# location / {
|
||||
# root html;
|
||||
# index index.html index.htm;
|
||||
# }
|
||||
#}
|
||||
|
||||
}
|
||||
@@ -11,6 +11,7 @@ alias view='vi -R'
|
||||
alias emacs='mg'
|
||||
alias sensible-editor=edit
|
||||
alias sensible-pager=pager
|
||||
alias hd="hexdump -C"
|
||||
|
||||
alias ip='ip --color=auto'
|
||||
alias ipb='ip -br'
|
||||
@@ -18,4 +19,6 @@ alias ipaddr='ip addr'
|
||||
alias iplink='ip link'
|
||||
alias bridge='bridge --color=auto'
|
||||
|
||||
alias llping='ping -L ff02::1 -I'
|
||||
|
||||
alias docker=podman
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Banner /etc/banner
|
||||
@@ -0,0 +1 @@
|
||||
local0.* -/var/log/upgrade.log
|
||||
@@ -17,10 +17,37 @@
|
||||
|
||||
set -e
|
||||
|
||||
nm=$(basename $0)
|
||||
nm=$(basename "$0")
|
||||
err=0
|
||||
opt="-k"
|
||||
|
||||
# External button or bootloader changed kernel command line
|
||||
check_factory()
|
||||
{
|
||||
if [ -f /mnt/cfg/infix/.reset ]; then
|
||||
return 0;
|
||||
fi
|
||||
|
||||
if grep -q 'finit.cond=factory-reset' /proc/cmdline; then
|
||||
return 0;
|
||||
fi
|
||||
|
||||
# Add to your br2-external to extend factory-reset check
|
||||
if [ ! -x /lib/infix/check-factory ]; then
|
||||
return 1;
|
||||
fi
|
||||
|
||||
/lib/infix/check-factory
|
||||
}
|
||||
|
||||
factory_reset()
|
||||
{
|
||||
# XXX: flash LEDs to confirm factory-reset in progress
|
||||
logger $opt -p user.crit -t "$nm" "Resetting to factory defaults."
|
||||
rm -rf /mnt/cfg/* /mnt/var/*
|
||||
sync
|
||||
}
|
||||
|
||||
mount_rw()
|
||||
{
|
||||
# If something is already setup, leave it be.
|
||||
@@ -60,6 +87,10 @@ mount_overlay()
|
||||
mkdir -p -m 0755 "$u"
|
||||
mkdir -p -m 0755 "$w"
|
||||
|
||||
# Ensure that all users in wheel can create the .reset file
|
||||
# on /cfg and upload docker images to /var
|
||||
chgrp wheel "$(dirname "$u")"
|
||||
|
||||
mount -t overlay "$tag-overlay" "$dst" \
|
||||
-o lowerdir="$dst",upperdir="$u",workdir="$w"
|
||||
}
|
||||
@@ -78,12 +109,8 @@ varsrc=/mnt/var
|
||||
if ! mount_rw var >/dev/null 2>&1; then
|
||||
logger $opt -p user.warn -t "$nm" \
|
||||
"No persistent storage found for /var, only /var/lib is persisted."
|
||||
varsrc=/mnt/tmp
|
||||
varsrc=/mnt/tmp/infix/var
|
||||
vlibsrc=/mnt/cfg/vlib
|
||||
else
|
||||
mount_bind "$varsrc" /var
|
||||
varsrc=
|
||||
vlibsrc=
|
||||
fi
|
||||
|
||||
cfgsrc=/mnt/cfg
|
||||
@@ -100,35 +127,23 @@ if ! mount_rw cfg >/dev/null 2>&1; then
|
||||
# there's no point in overlaying one ramdisk on top of another.
|
||||
vlibsrc=
|
||||
else
|
||||
# Check for factory reset
|
||||
if [ -f /mnt/cfg/infix/.reset ]; then
|
||||
logger $opt -p user.crit -t "$nm" "Resetting to factory defaults."
|
||||
rm -rf /mnt/cfg/infix /mnt/var/infix
|
||||
sync
|
||||
fi
|
||||
|
||||
# Check build: NETCONF or Classic
|
||||
# Classic Infix has read-write /etc across boots
|
||||
if [ "$VARIANT_ID" != "netconf" ]; then
|
||||
etcsrc=/mnt/cfg
|
||||
fi
|
||||
|
||||
# Ensure that all users in wheel can create the .reset file
|
||||
mkdir -p /mnt/cfg/infix
|
||||
chgrp wheel /mnt/cfg/infix
|
||||
fi
|
||||
|
||||
mount_overlay cfg $cfgsrc /cfg
|
||||
mount_overlay etc $etcsrc /etc
|
||||
mount_overlay home $cfgsrc /home
|
||||
mount_overlay root $cfgsrc /root
|
||||
if check_factory; then
|
||||
factory_reset
|
||||
fi
|
||||
|
||||
[ "$varsrc" ] && mount_overlay var "$varsrc" /var
|
||||
[ "$vlibsrc" ] && mount_bind "$vlibsrc" /var/lib
|
||||
mount_overlay cfg "$cfgsrc" /cfg
|
||||
mount_overlay etc "$etcsrc" /etc
|
||||
mount_overlay home "$cfgsrc" /home
|
||||
mount_overlay root "$cfgsrc" /root
|
||||
mount_bind "$varsrc" /var
|
||||
|
||||
# Keep transient configs in a ramdisk and symlink out to /cfg for
|
||||
# startup.
|
||||
mkdir -p /mnt/tmp/infix/db
|
||||
ln -s /cfg/startup_db /mnt/tmp/infix/db/startup_db
|
||||
[ "$vlibsrc" ] && mount_bind "$vlibsrc" /var/lib
|
||||
|
||||
for tag in $(ls /sys/bus/virtio/devices/*/mount_tag 2>/dev/null); do
|
||||
if [ "$(cat $tag | tr -d '\0')" = hostfs ]; then
|
||||
|
||||
@@ -30,7 +30,9 @@ for netif in /sys/class/net/*; do
|
||||
done
|
||||
|
||||
# Find and mark all switch ports
|
||||
ports=$(devlink port 2>/dev/null | awk '/flavour physical/{print $5}')
|
||||
ports=$(devlink -j port | jq -r '.port[]
|
||||
| select(.flavour == "physical")
|
||||
| .netdev')
|
||||
for iface in $ports; do
|
||||
ip link set "$iface" group port
|
||||
done
|
||||
|
||||
@@ -0,0 +1,267 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import importlib.machinery
|
||||
import json
|
||||
import os
|
||||
import struct
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
onieprom = importlib.machinery.SourceFileLoader("onieprom","/bin/onieprom").load_module()
|
||||
|
||||
KKIT_IANA_PEM = 61046
|
||||
|
||||
class DTSystem:
|
||||
BASE = "/sys/firmware/devicetree/base"
|
||||
INFIX = BASE + "/chosen/infix"
|
||||
|
||||
def __init__(self):
|
||||
self.vpdseq = 0
|
||||
|
||||
dt = {}
|
||||
for root, _, files in os.walk(DTSystem.BASE):
|
||||
if "phandle" not in files:
|
||||
continue
|
||||
|
||||
phandle = os.path.join(root, "phandle")
|
||||
if not os.path.exists(phandle):
|
||||
continue
|
||||
|
||||
ph, = struct.unpack(">L", open(phandle, "rb").read())
|
||||
dt[ph] = root
|
||||
|
||||
sys = {}
|
||||
for root, dirs, _ in os.walk("/sys/devices"):
|
||||
if "of_node" not in dirs:
|
||||
continue
|
||||
|
||||
phandle = os.path.join(root, "of_node", "phandle")
|
||||
if not os.path.exists(phandle):
|
||||
continue
|
||||
|
||||
ph, = struct.unpack(">L", open(phandle, "rb").read())
|
||||
sys[ph] = root
|
||||
|
||||
phs = set(list(dt.keys()) + list(sys.keys()))
|
||||
self.devs = { ph: Device(ph, dt.get(ph), sys.get(ph)) for ph in phs }
|
||||
self.base = Device(0, None, DTSystem.BASE)
|
||||
self.infix = Device(0, None, DTSystem.INFIX)
|
||||
|
||||
def __get_phandle_array(self, name):
|
||||
path = os.path.join(DTSystem.INFIX, name)
|
||||
if not os.path.exists(path):
|
||||
return ()
|
||||
|
||||
data = open(path, "rb").read()
|
||||
elems = len(data) // struct.calcsize(">L")
|
||||
return struct.unpack(">" + elems * "L", data)
|
||||
|
||||
def device_from_ph(self, ph):
|
||||
return self.devs.get(ph)
|
||||
|
||||
def into_vpd(self, dev):
|
||||
def parse():
|
||||
if not dev.available():
|
||||
return {}
|
||||
|
||||
try:
|
||||
data = onieprom.from_tlv(open(dev.attrpath("nvmem"), "rb", 0))
|
||||
except:
|
||||
data = {}
|
||||
|
||||
return data
|
||||
|
||||
self.vpdseq += 1
|
||||
return {
|
||||
"board": dev.dtstr("infix,board", f"UNKNOWN{self.vpdseq}"),
|
||||
"available": dev.available(),
|
||||
"trusted": dev.hasdtattr("infix,trusted"),
|
||||
"data": parse(),
|
||||
}
|
||||
|
||||
def infix_devices(self, kind):
|
||||
phs = self.__get_phandle_array(kind)
|
||||
return [self.device_from_ph(ph) for ph in phs]
|
||||
|
||||
def infix_vpds(self):
|
||||
return [self.into_vpd(dev) for dev in self.infix_devices("vpds")]
|
||||
|
||||
class QEMUSystem:
|
||||
BASE = "/sys/firmware/qemu_fw_cfg"
|
||||
REV = BASE + "/rev"
|
||||
VPD = BASE + "/by_name/opt/vpd/raw"
|
||||
|
||||
def product_vpd(self):
|
||||
data = {}
|
||||
if os.path.exists(QEMUSystem.VPD):
|
||||
try:
|
||||
data = onieprom.from_tlv(open(QEMUSystem.VPD, "rb", 0))
|
||||
except:
|
||||
pass
|
||||
|
||||
return {
|
||||
"board": "product",
|
||||
"available": os.path.exists(QEMUSystem.VPD),
|
||||
"trusted": True,
|
||||
"data": data,
|
||||
}
|
||||
|
||||
def vpds(self):
|
||||
return [self.product_vpd()]
|
||||
|
||||
class Device:
|
||||
def __init__(self, ph, dtpath, syspath):
|
||||
self.ph, self.dtpath, self.syspath = ph, dtpath, syspath
|
||||
|
||||
def available(self):
|
||||
return self.syspath != None
|
||||
|
||||
def __getitem__(self, attr):
|
||||
return self.attr(attr).decode("utf-8").strip("\0")
|
||||
|
||||
def __setitem__(self, attr, value):
|
||||
return self.attr(attr, val=value.encode("utf-8"))
|
||||
|
||||
|
||||
def attrpath(self, attr):
|
||||
return os.path.join(self.syspath, attr)
|
||||
|
||||
def hasattr(self, attr):
|
||||
return os.path.exists(self.attrpath(attr))
|
||||
|
||||
def attr(self, attr, default=None, val=None):
|
||||
if not self.hasattr(attr):
|
||||
return default if val == None else False
|
||||
|
||||
if val:
|
||||
open(self.attrpath(attr), "wb").write(value)
|
||||
return True
|
||||
|
||||
return open(self.attrpath(attr), "rb").read()
|
||||
|
||||
def str(self, attr, default=None):
|
||||
val = self.attr(attr)
|
||||
return val.decode("utf-8").strip("\0") if val else default
|
||||
|
||||
|
||||
def dtattrpath(self, attr):
|
||||
return os.path.join(self.dtpath, attr)
|
||||
|
||||
def hasdtattr(self, attr):
|
||||
return os.path.exists(self.dtattrpath(attr))
|
||||
|
||||
def dtattr(self, attr, default=None):
|
||||
if not self.hasdtattr(attr):
|
||||
return default
|
||||
|
||||
return open(self.dtattrpath(attr), "rb").read()
|
||||
|
||||
def dtstr(self, attr, default=None):
|
||||
val = self.dtattr(attr)
|
||||
return val.decode("utf-8").strip("\0") if val else default
|
||||
|
||||
|
||||
def vpd_get_json_ve(vpd, pem):
|
||||
ves = vpd["data"].get("vendor-extension")
|
||||
if not ves:
|
||||
return {}
|
||||
|
||||
out = {}
|
||||
for ve in filter(lambda ve: ve[0] == pem, ves):
|
||||
out.update(json.loads(ve[1]))
|
||||
|
||||
return out
|
||||
|
||||
def vpd_get_pwhash(vpd):
|
||||
if not vpd.get("trusted"):
|
||||
return None
|
||||
|
||||
kkit = vpd_get_json_ve(vpd, KKIT_IANA_PEM)
|
||||
return kkit.get("pwhash")
|
||||
|
||||
def vpd_inject(out, vpds):
|
||||
out["vpd"] = { vpd["board"]: vpd for vpd in vpds }
|
||||
|
||||
product = out["vpd"].get("product", {}).get("data", {})
|
||||
hoistattrs = ("vendor", "product-name", "part-number", "serial-number", "mac-address")
|
||||
for attr in hoistattrs:
|
||||
if attr in product:
|
||||
out[attr] = product[attr]
|
||||
|
||||
for vpd in vpds:
|
||||
pwhash = vpd_get_pwhash(vpd)
|
||||
if pwhash:
|
||||
out["factory-password-hash"] = pwhash
|
||||
break
|
||||
|
||||
def probe_qemusystem(out):
|
||||
ADMINHASH = "$5$mI/zpOAqZYKLC2WU$i7iPzZiIjOjrBF3NyftS9CCq8dfYwHwrmUK097Jca9A"
|
||||
|
||||
qsys = QEMUSystem()
|
||||
vpds = qsys.vpds()
|
||||
vpd_inject(out, vpds)
|
||||
|
||||
for (attr, default) in (
|
||||
("vendor", "QEMU"),
|
||||
("product-name", "VM"),
|
||||
):
|
||||
if not out[attr]:
|
||||
out[attr] = default
|
||||
|
||||
if not out["factory-password-hash"] and \
|
||||
not out["vpd"]["product"]["available"]:
|
||||
# Virtual instance without VPD emulation, fallback to
|
||||
# admin/admin
|
||||
out["factory-password-hash"] = ADMINHASH
|
||||
|
||||
# Let others react to the fact that we are running in QEMU
|
||||
subprocess.run("initctl -nbq cond set qemu".split())
|
||||
return 0
|
||||
|
||||
def probe_dtsystem(out):
|
||||
dtsys = DTSystem()
|
||||
vpds = dtsys.infix_vpds()
|
||||
|
||||
model = dtsys.base.str("model")
|
||||
if model:
|
||||
out["product-name"] = model
|
||||
|
||||
staticpw = dtsys.infix.str("factory-password-hash")
|
||||
if not out["factory-password-hash"]:
|
||||
out["factory-password-hash"] = staticpw
|
||||
|
||||
vpd_inject(out, vpds)
|
||||
return 0
|
||||
|
||||
def main():
|
||||
out = {
|
||||
"vendor": None,
|
||||
"product-name": None,
|
||||
"part-number": None,
|
||||
"serial-number": None,
|
||||
"mac-address": None,
|
||||
"factory-password-hash": None,
|
||||
"vpd": {}
|
||||
}
|
||||
vpds = []
|
||||
|
||||
if os.path.exists(QEMUSystem.REV):
|
||||
err = probe_qemusystem(out)
|
||||
elif os.path.exists(DTSystem.BASE):
|
||||
err = probe_dtsystem(out)
|
||||
else:
|
||||
return 1
|
||||
|
||||
if err:
|
||||
return err
|
||||
|
||||
if not out["factory-password-hash"]:
|
||||
sys.stdout.write("\n\n\033[31mCRITICAL BOOTSTRAP ERROR\nNO FACTORY PASSWORD FOUND\033[0m\n\n")
|
||||
err = 1
|
||||
|
||||
json.dump(out, open("/run/system.json", "w"))
|
||||
os.chmod("/run/system.json", 0o444)
|
||||
return err
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -0,0 +1,38 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
disk=$1
|
||||
bootoffs=$2
|
||||
|
||||
bootsize=8M
|
||||
auxsize=8M
|
||||
|
||||
total=$(awk -vdisk="$(basename $disk)" '$4 == disk { print($3 / 1024); }' /proc/partitions)
|
||||
if [ "$total" -ge 4096 ]; then
|
||||
imgsize=1024M
|
||||
cfgsize=512M
|
||||
elif [ "$total" -ge 2048 ]; then
|
||||
imgsize=512M
|
||||
cfgsize=256M
|
||||
elif [ "$total" -ge 1024 ]; then
|
||||
imgsize=256M
|
||||
cfgsize=64M
|
||||
elif [ "$total" -ge 512 ]; then
|
||||
imgsize=192M
|
||||
cfgsize=16M
|
||||
else
|
||||
echo "$disk is only ${total}M, at least 512M is required" >2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
sgdisk \
|
||||
-o \
|
||||
-n1:${bootoffs}:+${bootsize} -t1:8301 -c1:boot \
|
||||
-n2::+${auxsize} -t2:8301 -c2:aux \
|
||||
-n3::+${imgsize} -t3:8300 -c3:primary \
|
||||
-n4::+${imgsize} -t4:8300 -c4:secondary \
|
||||
-n5::+${cfgsize} -t5:8302 -c5:cfg \
|
||||
-n6:: -t6:8310 -c6:var \
|
||||
-p \
|
||||
$disk
|
||||
@@ -0,0 +1,115 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
progname="$0"
|
||||
|
||||
usage()
|
||||
{
|
||||
cat <<EOF
|
||||
Usage: ${progname} <url-to-pkg> <block-dev>
|
||||
|
||||
Provision Infix to a system (typically netbooted) with a blank block
|
||||
device
|
||||
|
||||
- Downloads an Infix install bundle, using curl(1)
|
||||
- Creates an Infix compatible partition table on the block device
|
||||
- Initializes auxiliary and configuration filesystems and metadata
|
||||
- Installs Infix to both primary and secondary partitions
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
step()
|
||||
{
|
||||
current="$*"
|
||||
printf "\e[37;44m>>> %-60s\e[0m\n" "${current} ..." >&2
|
||||
}
|
||||
|
||||
ok()
|
||||
{
|
||||
printf "\e[37;42m<<< %-56s OK\e[0m\n\n" "${current}" >&2
|
||||
}
|
||||
|
||||
err()
|
||||
{
|
||||
printf "\e[37;41m!!! %-56s ERR\e[0m\n\n" "${current}" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
while getopts "h" opt; do
|
||||
case ${opt} in
|
||||
h)
|
||||
usage && exit 0
|
||||
;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND - 1))
|
||||
|
||||
if [ $# -lt 2 ]; then
|
||||
usage && exit 1
|
||||
fi
|
||||
|
||||
url=$1
|
||||
blk=$2
|
||||
pkg=/tmp/pkg
|
||||
|
||||
|
||||
step "Downloading $url"
|
||||
curl -o $pkg $url || err
|
||||
rauc info $pkg || err
|
||||
ok
|
||||
|
||||
|
||||
step "Formatting $blk"
|
||||
[ -b $blk ] || { echo "$blk is not a block device" >&2; err; }
|
||||
/lib/infix/prod/fdisk $blk || err
|
||||
sleep 1
|
||||
ok
|
||||
|
||||
for part in aux cfg var; do
|
||||
step "Creating $part filesystem"
|
||||
mkfs.ext4 -F -L $part /dev/disk/by-partlabel/$part || err
|
||||
mount /mnt/$part || err
|
||||
ok
|
||||
done
|
||||
|
||||
step "Bootstrapping aux partition"
|
||||
if [ -f /etc/fw_env.config ]; then
|
||||
size_n_file=$(awk '{ print("-s", $3, "-o", $1); }' /etc/fw_env.config)
|
||||
mkenvimage $size_n_file - <<EOF
|
||||
BOOT_ORDER=primary secondary net
|
||||
BOOT_primary_LEFT=1
|
||||
BOOT_secondary_LEFT=1
|
||||
BOOT_net_LEFT=1
|
||||
EOF
|
||||
fi
|
||||
ok
|
||||
|
||||
step "Preparing installation"
|
||||
rm -f /tmp/rauc
|
||||
[ -f /etc/default/rauc ] && cp /etc/default/rauc /tmp/rauc
|
||||
ok
|
||||
|
||||
|
||||
step "Installing to primary partition"
|
||||
echo "RAUC_ARGS=--override-boot-slot=secondary" >/etc/default/rauc
|
||||
initctl -b restart rauc || err
|
||||
rauc install $pkg || err
|
||||
ok
|
||||
|
||||
|
||||
step "Installing to secondary partition"
|
||||
echo "RAUC_ARGS=--override-boot-slot=primary" >/etc/default/rauc
|
||||
initctl -b restart rauc || err
|
||||
rauc install $pkg || err
|
||||
ok
|
||||
|
||||
|
||||
step "Finishing installation"
|
||||
rm /etc/default/rauc
|
||||
[ -f /tmp/rauc ] && cp /tmp/rauc /etc/default/rauc
|
||||
initctl -b restart rauc || err
|
||||
rauc status mark-active rootfs.0
|
||||
rauc status --detailed
|
||||
ok
|
||||
@@ -1,9 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
for type in ecdsa ed25519 rsa; do
|
||||
[ -f /var/lib/ssh/ssh_host_${type}_key ] \
|
||||
|| ssh-keygen -N "" -t $type -f /var/lib/ssh/ssh_host_${type}_key \
|
||||
|| exit 1
|
||||
done
|
||||
|
||||
initctl cond set ssh-hostkeys
|
||||
@@ -0,0 +1,134 @@
|
||||
#!/bin/sh
|
||||
|
||||
# udhcpc script edited by Tim Riker <Tim@Rikers.org>
|
||||
|
||||
[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
|
||||
|
||||
ACTION="$1"
|
||||
RESOLV_CONF="/etc/resolv.conf"
|
||||
[ -e $RESOLV_CONF ] || touch $RESOLV_CONF
|
||||
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
|
||||
[ -n "$subnet" ] && NETMASK="$subnet"
|
||||
# Handle stateful DHCPv6 like DHCPv4
|
||||
[ -n "$ipv6" ] && ip="$ipv6/128"
|
||||
|
||||
if [ -z "${IF_WAIT_DELAY}" ]; then
|
||||
IF_WAIT_DELAY=10
|
||||
fi
|
||||
|
||||
wait_for_ipv6_default_route() {
|
||||
printf "Waiting for IPv6 default route to appear"
|
||||
while [ $IF_WAIT_DELAY -gt 0 ]; do
|
||||
if ip -6 route list | grep -q default; then
|
||||
printf "\n"
|
||||
return
|
||||
fi
|
||||
sleep 1
|
||||
printf "."
|
||||
: $((IF_WAIT_DELAY -= 1))
|
||||
done
|
||||
printf " timeout!\n"
|
||||
}
|
||||
|
||||
flush_dhcp_addresses() {
|
||||
addrs=$(ip -j addr show dev $interface | jq -c \
|
||||
'.[0].addr_info[] | select(.family == "inet") | select(.protocol == "dhcp")')
|
||||
|
||||
for addr in $addrs; do
|
||||
ip="$(echo "$addr" | jq -r '."local"')"
|
||||
prefix="$(echo "$addr" | jq -r '."prefixlen"')"
|
||||
ip addr del "$ip/$prefix" dev "$interface"
|
||||
done
|
||||
}
|
||||
|
||||
case "$ACTION" in
|
||||
deconfig)
|
||||
flush_dhcp_addresses
|
||||
|
||||
/bin/ip link set dev $interface up
|
||||
|
||||
# drop info from this interface
|
||||
# resolv.conf may be a symlink to /tmp/, so take care
|
||||
TMPFILE=$(mktemp)
|
||||
grep -vE "# $interface\$" $RESOLV_CONF > $TMPFILE
|
||||
cat $TMPFILE > $RESOLV_CONF
|
||||
rm -f $TMPFILE
|
||||
|
||||
if [ -x /usr/sbin/avahi-autoipd ]; then
|
||||
/usr/sbin/avahi-autoipd -c $interface && /usr/sbin/avahi-autoipd -k $interface
|
||||
fi
|
||||
;;
|
||||
|
||||
leasefail|nak)
|
||||
if [ -x /usr/sbin/avahi-autoipd ]; then
|
||||
/usr/sbin/avahi-autoipd -c $interface || /usr/sbin/avahi-autoipd -wD $interface --no-chroot
|
||||
fi
|
||||
;;
|
||||
|
||||
renew|bound)
|
||||
if [ -x /usr/sbin/avahi-autoipd ]; then
|
||||
/usr/sbin/avahi-autoipd -c $interface && /usr/sbin/avahi-autoipd -k $interface
|
||||
fi
|
||||
/bin/ip addr add dev $interface $ip/$NETMASK $BROADCAST proto 5
|
||||
if [ -n "$ipv6" ] ; then
|
||||
wait_for_ipv6_default_route
|
||||
fi
|
||||
|
||||
# RFC3442: If the DHCP server returns both a Classless
|
||||
# Static Routes option and a Router option, the DHCP
|
||||
# client MUST ignore the Router option.
|
||||
if [ -n "$staticroutes" ]; then
|
||||
echo "deleting routers"
|
||||
route -n | while read dest gw mask flags metric ref use iface; do
|
||||
[ "$iface" != "$interface" -o "$gw" = "0.0.0.0" ] || \
|
||||
route del -net "$dest" netmask "$mask" gw "$gw" dev "$interface"
|
||||
done
|
||||
|
||||
# format: dest1/mask gw1 ... destn/mask gwn
|
||||
set -- $staticroutes
|
||||
while [ -n "$1" -a -n "$2" ]; do
|
||||
ip route add -net "$1" via "$2" dev "$interface" proto 16
|
||||
shift 2
|
||||
done
|
||||
elif [ -n "$router" ] ; then
|
||||
echo "deleting routers"
|
||||
while route del default gw 0.0.0.0 dev $interface 2> /dev/null; do
|
||||
:
|
||||
done
|
||||
|
||||
for i in $router ; do
|
||||
ip route add default via $i dev $interface proto 16
|
||||
done
|
||||
fi
|
||||
|
||||
# drop info from this interface
|
||||
# resolv.conf may be a symlink to /tmp/, so take care
|
||||
TMPFILE=$(mktemp)
|
||||
grep -vE "# $interface\$" $RESOLV_CONF > $TMPFILE
|
||||
cat $TMPFILE > $RESOLV_CONF
|
||||
rm -f $TMPFILE
|
||||
|
||||
# prefer rfc3397 domain search list (option 119) if available
|
||||
if [ -n "$search" ]; then
|
||||
search_list=$search
|
||||
elif [ -n "$domain" ]; then
|
||||
search_list=$domain
|
||||
fi
|
||||
|
||||
[ -n "$search_list" ] &&
|
||||
echo "search $search_list # $interface" >> $RESOLV_CONF
|
||||
|
||||
for i in $dns ; do
|
||||
echo adding dns $i
|
||||
echo "nameserver $i # $interface" >> $RESOLV_CONF
|
||||
done
|
||||
;;
|
||||
esac
|
||||
|
||||
HOOK_DIR="$0.d"
|
||||
for hook in "${HOOK_DIR}/"*; do
|
||||
[ -f "${hook}" -a -x "${hook}" ] || continue
|
||||
"${hook}" "$ACTION"
|
||||
done
|
||||
|
||||
exit 0
|
||||
@@ -8,9 +8,13 @@
|
||||
&env {
|
||||
vendor = "infix";
|
||||
bootdelay = "-2";
|
||||
bootcmd = "run ixboot";
|
||||
bootcmd = "run ixbtn";
|
||||
boot_targets = "virtio mmc";
|
||||
|
||||
ixbtn = /incbin/("scripts/ixbtn.sh");
|
||||
ixdevmode = /incbin/("scripts/ixdevmode.sh");
|
||||
ixfactory = /incbin/("scripts/ixfactory.sh");
|
||||
ixbtn = /incbin/("scripts/ixbtn.sh");
|
||||
ixboot = /incbin/("scripts/ixboot.sh");
|
||||
ixbootmedia = /incbin/("scripts/ixbootmedia.sh");
|
||||
ixbootslot = /incbin/("scripts/ixbootslot.sh");
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
setenv valid_media no
|
||||
|
||||
for tgt in "${boot_targets}"; do
|
||||
if test "${tgt}" = "mmc0"; then
|
||||
setenv devtype "mmc"
|
||||
@@ -17,7 +19,7 @@ for tgt in "${boot_targets}"; do
|
||||
env import -b ${loadaddr} ${filesize} BOOT_ORDER DEBUG
|
||||
fi
|
||||
|
||||
test -n "${BOOT_ORDER}" || setenv BOOT_ORDER "primary secondary dhcp"
|
||||
test -n "${BOOT_ORDER}" || setenv BOOT_ORDER "primary secondary net"
|
||||
|
||||
if test -n "${DEBUG}"; then
|
||||
setenv bootargs_log "debug"
|
||||
@@ -25,8 +27,16 @@ for tgt in "${boot_targets}"; do
|
||||
setenv bootargs_log "loglevel=4"
|
||||
fi
|
||||
|
||||
setenv valid_media yes
|
||||
run ixbootmedia
|
||||
fi
|
||||
done
|
||||
|
||||
if test "${valid_media}" = "no"; then
|
||||
echo "NO BOOTABLE MEDIA FOUND, falling back to netboot"
|
||||
setenv BOOT_ORDER "net"
|
||||
setenv bootargs_log "debug"
|
||||
run ixbootmedia
|
||||
fi
|
||||
|
||||
reset
|
||||
|
||||
@@ -14,7 +14,13 @@ if test "${prepared}" = "ok"; then
|
||||
if iminfo ${ramdisk_addr_r}; then
|
||||
echo "${slot}: Booting..."
|
||||
|
||||
setenv bootargs_rauc "rauc.slot=${slot}"
|
||||
setenv bootargs_user "rauc.slot=${slot}"
|
||||
if test "${factory_reset}" = "yes"; then
|
||||
setenv bootargs_user "${bootargs_user} finit.cond=factory-reset"
|
||||
fi
|
||||
if test "${dev_mode}" = "yes"; then
|
||||
setenv bootargs_user "${bootargs_user} finit.cond=dev-mode"
|
||||
fi
|
||||
|
||||
blkmap create boot
|
||||
blkmap get boot dev blkmapnum
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
setenv dev_mode no
|
||||
setenv factory_reset no
|
||||
|
||||
echo -n "dev-mode: "
|
||||
run ixdevmode
|
||||
echo -n "factory-reset: "
|
||||
run ixfactory
|
||||
|
||||
if test "${dev_mode}" = "yes"; then
|
||||
sleep 1 && run ixboot
|
||||
else
|
||||
run ixboot
|
||||
fi
|
||||
@@ -0,0 +1,3 @@
|
||||
if button dev-mode; then
|
||||
setenv dev_mode yes
|
||||
fi
|
||||
@@ -0,0 +1,7 @@
|
||||
if button factory-reset; then
|
||||
echo "Keep button pressed for 10 seconds to engage reset"
|
||||
if sleep 10 && button factory-reset; then
|
||||
setenv factory_reset yes
|
||||
echo "FACTORY RESET ENGAGED"
|
||||
fi
|
||||
fi
|
||||
@@ -1 +0,0 @@
|
||||
../usr/bin/klish
|
||||
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash -li
|
||||
# Source settings, aliases, and probe terminal size, then hand over to klish
|
||||
exec /usr/bin/klish
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"ietf-system:system": {
|
||||
"authentication": {
|
||||
"user": [
|
||||
{
|
||||
"name": "admin",
|
||||
"password": "$6$bKPp6xu45L1cmp70$fcwDhGZct4q8LxwPASf9iVHyWqnklcdjeYi/SupLo1K9nb.aAQUz48.3qTcW38XL6gQzfHyGoyeDG2orjPUwm1",
|
||||
"infix-system:shell": "infix-shell-type:clish"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
{
|
||||
"input": {
|
||||
"path": {
|
||||
"locate": { "path": "/run/led/locate" },
|
||||
|
||||
"status-prime": { "path": "/run/led/status-prime" },
|
||||
"status-ok": { "path": "/run/led/status-ok" },
|
||||
"status-err": { "path": "/run/led/status-err" },
|
||||
"status-crit": { "path": "/run/led/status-crit" },
|
||||
|
||||
"fault-prime": { "path": "/run/led/fault-prime" },
|
||||
"fault-ok": { "path": "/run/led/fault-ok" },
|
||||
"fault-err": { "path": "/run/led/fault-err" },
|
||||
"fault-crit": { "path": "/run/led/fault-crit" },
|
||||
|
||||
"lan-prime": { "path": "/run/led/lan-prime" },
|
||||
"lan-ok": { "path": "/run/led/lan-ok" },
|
||||
"lan-err": { "path": "/run/led/lan-err" },
|
||||
"lan-crit": { "path": "/run/led/lan-crit" },
|
||||
|
||||
"startup": { "path": "/run/finit/cond/run/startup/success" },
|
||||
"fail-safe": { "path": "/run/finit/cond/run/failure/success" },
|
||||
"panic": { "path": "/run/finit/cond/run/failure/failure" }
|
||||
},
|
||||
"udev": {
|
||||
"power-a": { "subsystem": "power_supply" },
|
||||
"power-b": { "subsystem": "power_supply" }
|
||||
}
|
||||
},
|
||||
|
||||
"output": {
|
||||
"led-group": {
|
||||
"port-link-act": {
|
||||
"match": ["*:green:tp", "*:green:sfp", "*:green:port" ],
|
||||
|
||||
"rules": [
|
||||
{ "if": "true", "then": { "trigger": "netdev", "link": 1, "rx": 1, "tx": 1 } }
|
||||
]
|
||||
},
|
||||
"port-alarm": {
|
||||
"match": ["*:yellow:tp", "*:yellow:sfp", "*:yellow:port" ],
|
||||
|
||||
"rules": [
|
||||
]
|
||||
}
|
||||
},
|
||||
"led": {
|
||||
"red:status": {
|
||||
"rules": [
|
||||
{ "if": "locate", "then": "@off" },
|
||||
{ "if": "panic", "then": "@blink-5hz" },
|
||||
{ "if": "status-crit", "then": "@blink-1hz" },
|
||||
{ "if": "status-err", "then": "@on" }
|
||||
]
|
||||
},
|
||||
"green:status": {
|
||||
"rules": [
|
||||
{ "if": "locate", "then": "@blink-1hz" },
|
||||
{ "if": "status-prime", "then": "@blink-1hz" },
|
||||
{ "if": "status-ok", "then": "@on" }
|
||||
]
|
||||
},
|
||||
"red:fault": {
|
||||
"rules": [
|
||||
{ "if": "locate", "then": "@off" },
|
||||
{ "if": "panic", "then": "@blink-5hz" },
|
||||
{ "if": "fault-crit", "then": "@blink-1hz" },
|
||||
{ "if": "fault-err", "then": "@on" }
|
||||
]
|
||||
},
|
||||
"green:fault": {
|
||||
"rules": [
|
||||
{ "if": "locate", "then": "@blink-1hz" },
|
||||
{ "if": "fault-prime", "then": "@blink-1hz" },
|
||||
{ "if": "fault-ok", "then": "@on" }
|
||||
]
|
||||
},
|
||||
"red:lan": {
|
||||
"rules": [
|
||||
{ "if": "locate", "then": "@off" },
|
||||
{ "if": "panic", "then": "@blink-5hz" },
|
||||
{ "if": "lan-crit", "then": "@blink-1hz" },
|
||||
{ "if": "lan-err", "then": "@on" }
|
||||
]
|
||||
},
|
||||
"green:lan": {
|
||||
"rules": [
|
||||
{ "if": "locate", "then": "@blink-1hz" },
|
||||
{ "if": "lan-prime", "then": "@blink-1hz" },
|
||||
{ "if": "lan-ok", "then": "@on" }
|
||||
]
|
||||
},
|
||||
|
||||
"red:boot": {
|
||||
"rules": [
|
||||
{ "if": "locate", "then": "@off" },
|
||||
{ "if": "panic", "then": "@blink-5hz" },
|
||||
{ "if": "fail-safe", "then": "@blink-5hz" }
|
||||
]
|
||||
},
|
||||
"green:boot": {
|
||||
"rules": [
|
||||
{ "if": "locate", "then": "@blink-1hz" },
|
||||
{ "if": "panic", "then": "@off" },
|
||||
{ "if": "startup", "then": "@on" },
|
||||
{ "if": "true", "then": "@blink-1hz" }
|
||||
]
|
||||
},
|
||||
|
||||
"red:power-a": {
|
||||
"rules": [
|
||||
{ "if": "panic", "then": "@blink-5hz" },
|
||||
{ "if": "!power-a:online", "then": "@blink-1hz" }
|
||||
]
|
||||
},
|
||||
"red:power-b": {
|
||||
"rules": [
|
||||
{ "if": "panic", "then": "@blink-5hz" },
|
||||
{ "if": "!power-b:online", "then": "@blink-1hz" }
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"aliases": {
|
||||
"on": {
|
||||
"brightness": true
|
||||
},
|
||||
"off": {
|
||||
"brightness": false
|
||||
},
|
||||
"blink-1hz": {
|
||||
"trigger": "timer",
|
||||
"delay_on": 500,
|
||||
"delay_off": 500
|
||||
},
|
||||
"blink-5hz": {
|
||||
"trigger": "timer",
|
||||
"delay_on": 100,
|
||||
"delay_off": 100
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
PATH=/lib/infix/factory:$PATH
|
||||
|
||||
[ "$FACTORY_D" ] || FACTORY_D=/etc/auto-factory.d
|
||||
[ "$CFG_D" ] || CFG_D=/cfg
|
||||
[ "$GENCFG_D" ] || GENCFG_D=/cfg/factory.d
|
||||
mkdir -p $GENCFG_D
|
||||
|
||||
gen-hostname >$FACTORY_D/20-auto-hostname.json
|
||||
gen-interfaces >$FACTORY_D/20-auto-interfaces.json
|
||||
|
||||
[ -s $GENCFG_D/20-auto-hostkey.json ] || gen-hostkeys >$GENCFG_D/20-auto-hostkey.json
|
||||
|
||||
# Allow regenerating default factory-config, but keep it read-ony
|
||||
# to prevent it from being overwritten by mistake by users.
|
||||
rm -f $CFG_D/auto-factory-config.cfg
|
||||
# shellcheck disable=SC2046
|
||||
jq -s 'reduce .[] as $item ({}; . * $item)' \
|
||||
$(find $FACTORY_D -name '*.json') \
|
||||
$(find $GENCFG_D -name '*.json') \
|
||||
>$CFG_D/auto-factory-config.cfg
|
||||
chmod 444 $CFG_D/auto-factory-config.cfg
|
||||
|
||||
# TODO: Look for statically defined factory-config, based on the
|
||||
# system's product ID.
|
||||
|
||||
# If we haven't found a better one, settle for auto-factory-config as
|
||||
# the system's factory-config.
|
||||
[ -h $CFG_D/factory-config.cfg ] || \
|
||||
ln -sf auto-factory-config.cfg $CFG_D/factory-config.cfg
|
||||
|
||||
# Bootstrap sysrepo db with all modules required by confd
|
||||
/usr/libexec/confd/confd-bootstrap.sh $CFG_D/factory-config.cfg $CFG_D/startup-config.cfg
|
||||
@@ -0,0 +1,440 @@
|
||||
#!/usr/bin/env python3
|
||||
import json
|
||||
import sys
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser(description="JSON CLI Pretty Printer")
|
||||
parser.add_argument("module", help="IETF Module")
|
||||
parser.add_argument("-n", "--name", help="Focus on specific name")
|
||||
args = parser.parse_args()
|
||||
|
||||
class Pad:
|
||||
iface = 16
|
||||
proto = 11
|
||||
state = 12
|
||||
data = 41
|
||||
|
||||
class PadRoute:
|
||||
prefix = 30
|
||||
protocol = 10
|
||||
next_hop = 30
|
||||
metric = 10
|
||||
|
||||
class PadSoftware:
|
||||
name = 10
|
||||
date = 25
|
||||
hash = 64
|
||||
state = 10
|
||||
version = 23
|
||||
|
||||
class Decore():
|
||||
@staticmethod
|
||||
def decorate(sgr, txt, restore="0"):
|
||||
return f"\033[{sgr}m{txt}\033[{restore}m"
|
||||
|
||||
@staticmethod
|
||||
def invert(txt):
|
||||
return Decore.decorate("7", txt)
|
||||
|
||||
@staticmethod
|
||||
def red(txt):
|
||||
return Decore.decorate("31", txt, "39")
|
||||
|
||||
@staticmethod
|
||||
def green(txt):
|
||||
return Decore.decorate("32", txt, "39")
|
||||
|
||||
def get_json_data(default, indata, *args):
|
||||
data = indata
|
||||
for arg in args:
|
||||
if arg in data:
|
||||
data = data.get(arg)
|
||||
else:
|
||||
return default
|
||||
|
||||
return data
|
||||
|
||||
class Route:
|
||||
def __init__(self,data):
|
||||
self.data = data
|
||||
self.prefix = data.get('ietf-ipv4-unicast-routing:destination-prefix', '')
|
||||
self.protocol = data.get('source-protocol','')[14:]
|
||||
self.metric = data.get('route-preference','')
|
||||
|
||||
interface = get_json_data(None, self.data, 'next-hop', 'outgoing-interface')
|
||||
address = get_json_data(None, self.data, 'next-hop', 'ietf-ipv4-unicast-routing:next-hop-address')
|
||||
special = get_json_data(None, self.data, 'next-hop', 'special-next-hop')
|
||||
if interface:
|
||||
self.next_hop = interface
|
||||
elif address:
|
||||
self.next_hop = address
|
||||
elif special:
|
||||
self.next_hop = special
|
||||
else:
|
||||
self.next_hop = "unspecified"
|
||||
|
||||
def print(self):
|
||||
row = f"{self.prefix:<{PadRoute.prefix}}"
|
||||
row += f"{self.next_hop:<{PadRoute.next_hop}}"
|
||||
row += f"{self.metric:<{PadRoute.metric}}"
|
||||
row += f"{self.protocol:<{PadRoute.protocol}}"
|
||||
print(row)
|
||||
|
||||
class Software:
|
||||
"""Software bundle class """
|
||||
def __init__(self, data):
|
||||
self.data = data
|
||||
self.name = data.get('bootname', '')
|
||||
self.size = data.get('size', '')
|
||||
self.type = data.get('class', '')
|
||||
self.hash = data.get('sha256', '')
|
||||
self.state = data.get('state', '')
|
||||
self.version = get_json_data('', self.data, 'bundle', 'version')
|
||||
self.date = get_json_data('', self.data, 'installed', 'datetime')
|
||||
|
||||
def is_rootfs(self):
|
||||
"""True if bundle type is 'rootfs'"""
|
||||
return self.type == "rootfs"
|
||||
|
||||
def print(self):
|
||||
"""Brief information about one bundle"""
|
||||
row = f"{self.name:<{PadSoftware.name}}"
|
||||
row += f"{self.state:<{PadSoftware.state}}"
|
||||
row += f"{self.version:<{PadSoftware.version}}"
|
||||
row += f"{self.date:<{PadSoftware.date}}"
|
||||
print(row)
|
||||
|
||||
def detail(self):
|
||||
"""Detailed information about one bundle"""
|
||||
print(f"Name : {self.name}")
|
||||
print(f"State : {self.state}")
|
||||
print(f"Version : {self.version}")
|
||||
print(f"Size : {self.size}")
|
||||
print(f"SHA-256 : {self.hash}")
|
||||
print(f"Installed : {self.date}")
|
||||
|
||||
class Iface:
|
||||
def __init__(self, data):
|
||||
self.data = data
|
||||
self.name = data.get('name', '')
|
||||
self.type = data.get('type', '')
|
||||
self.index = data.get('if-index', '')
|
||||
self.oper_status = data.get('oper-status', '')
|
||||
self.autoneg = get_json_data('unknown', self.data, 'ieee802-ethernet-interface:ethernet',
|
||||
'auto-negotiation', 'enable')
|
||||
self.duplex = get_json_data('', self.data,'ieee802-ethernet-interface:ethernet','duplex')
|
||||
self.speed = get_json_data('', self.data, 'ieee802-ethernet-interface:ethernet', 'speed')
|
||||
self.phys_address = data.get('phys-address', '')
|
||||
|
||||
if data.get('statistics'):
|
||||
self.in_octets = data.get('statistics').get('in-octets', '')
|
||||
self.out_octets = data.get('statistics').get('out-octets', '')
|
||||
else:
|
||||
self.in_octets = ''
|
||||
self.out_octets = ''
|
||||
|
||||
if self.data.get('ietf-ip:ipv4'):
|
||||
self.mtu = self.data.get('ietf-ip:ipv4').get('mtu', '')
|
||||
self.ipv4_addr = self.data.get('ietf-ip:ipv4').get('address', '')
|
||||
else:
|
||||
self.mtu = ''
|
||||
self.ipv4_addr = []
|
||||
|
||||
if self.data.get('ietf-ip:ipv6'):
|
||||
self.ipv6_addr = self.data.get('ietf-ip:ipv6').get('address', '')
|
||||
else:
|
||||
self.ipv6_addr = []
|
||||
|
||||
if self.data.get('infix-interfaces:bridge-port'):
|
||||
self.bridge = self.data.get('infix-interfaces:bridge-port').get('bridge', None)
|
||||
else:
|
||||
self.bridge = ''
|
||||
|
||||
if self.data.get('infix-interfaces:vlan'):
|
||||
self.lower_if = self.data.get('infix-interfaces:vlan', None).get('lower-layer-if',None)
|
||||
else:
|
||||
self.lower_if = ''
|
||||
|
||||
def is_vlan(self):
|
||||
return self.type == "infix-if-type:vlan"
|
||||
|
||||
def is_bridge(self):
|
||||
return self.type == "infix-if-type:bridge"
|
||||
|
||||
def is_veth(self):
|
||||
return self.data['type'] == "infix-if-type:veth"
|
||||
|
||||
def pr_name(self, pipe=""):
|
||||
print(f"{pipe}{self.name:<{Pad.iface - len(pipe)}}", end="")
|
||||
|
||||
|
||||
def pr_proto_ipv4(self, pipe=''):
|
||||
for addr in self.ipv4_addr:
|
||||
origin = f"({addr['origin']})" if addr.get('origin') else ""
|
||||
|
||||
row = f"{pipe:<{Pad.iface}}"
|
||||
row += f"{'ipv4':<{Pad.proto}}"
|
||||
row += f"{'':<{Pad.state}}{addr['ip']}/{addr['prefix-length']} {origin}"
|
||||
print(row)
|
||||
|
||||
def pr_proto_ipv6(self, pipe=''):
|
||||
for addr in self.ipv6_addr:
|
||||
origin = f"({addr['origin']})" if addr.get('origin') else ""
|
||||
|
||||
row = f"{pipe:<{Pad.iface}}"
|
||||
row += f"{'ipv6':<{Pad.proto}}"
|
||||
row += f"{'':<{Pad.state}}{addr['ip']}/{addr['prefix-length']} {origin}"
|
||||
print(row)
|
||||
|
||||
def pr_proto_eth(self):
|
||||
row = f"{'ethernet':<{Pad.proto}}"
|
||||
dec = Decore.green if self.oper_status == "up" else Decore.red
|
||||
row += dec(f"{self.oper_status.upper():<{Pad.state}}")
|
||||
row += f"{self.phys_address:<{Pad.data}}"
|
||||
print(row)
|
||||
|
||||
def pr_bridge(self, _ifaces):
|
||||
self.pr_name(pipe="")
|
||||
self.pr_proto_eth()
|
||||
|
||||
|
||||
lowers = []
|
||||
for _iface in [Iface(data) for data in _ifaces]:
|
||||
if _iface.bridge and _iface.bridge == self.name:
|
||||
lowers.append(_iface)
|
||||
|
||||
if lowers:
|
||||
self.pr_proto_ipv4(pipe='│')
|
||||
self.pr_proto_ipv6(pipe='│')
|
||||
else:
|
||||
self.pr_proto_ipv4()
|
||||
self.pr_proto_ipv6()
|
||||
|
||||
for i, lower in enumerate(lowers):
|
||||
pipe = '└ ' if (i == len(lowers) -1) else '├ '
|
||||
lower.pr_name(pipe)
|
||||
lower.pr_proto_eth()
|
||||
|
||||
def pr_veth(self, _ifaces):
|
||||
self.pr_name(pipe="")
|
||||
self.pr_proto_eth()
|
||||
|
||||
if self.lower_if:
|
||||
row = f"{'':<{Pad.iface}}"
|
||||
row += f"{'veth':<{Pad.proto}}"
|
||||
row += f"{'':<{Pad.state}}"
|
||||
row += f"peer:{self.lower_if}"
|
||||
print(row)
|
||||
|
||||
self.pr_proto_ipv4()
|
||||
self.pr_proto_ipv6()
|
||||
|
||||
def pr_vlan(self, _ifaces):
|
||||
self.pr_name(pipe="")
|
||||
self.pr_proto_eth()
|
||||
|
||||
if self.lower_if:
|
||||
self.pr_proto_ipv4(pipe='│')
|
||||
self.pr_proto_ipv6(pipe='│')
|
||||
else:
|
||||
self.pr_proto_ipv4()
|
||||
self.pr_proto_ipv6()
|
||||
return
|
||||
|
||||
parent = find_iface(_ifaces, self.lower_if)
|
||||
if not parent:
|
||||
print(f"Error, didn't find parent interface for vlan {self.name}")
|
||||
sys.exit(1)
|
||||
parent.pr_name(pipe='└ ')
|
||||
parent.pr_proto_eth()
|
||||
|
||||
def pr_iface(self):
|
||||
print(f"{'name':<{20}}: {self.name}")
|
||||
print(f"{'index':<{20}}: {self.index}")
|
||||
if self.mtu:
|
||||
print(f"{'mtu':<{20}}: {self.mtu}")
|
||||
if self.oper_status:
|
||||
print(f"{'operational status':<{20}}: {self.oper_status}")
|
||||
|
||||
if self.lower_if:
|
||||
print(f"{'lower-layer-if':<{20}}: {self.lower_if}")
|
||||
|
||||
if self.autoneg != 'unknown':
|
||||
val = "on" if self.autoneg else "off"
|
||||
print(f"{'auto-negotiation':<{20}}: {val}")
|
||||
|
||||
if self.duplex:
|
||||
print(f"{'duplex':<{20}}: {self.duplex}")
|
||||
|
||||
if self.speed:
|
||||
mbs = float(self.speed) * 1000
|
||||
print(f"{'speed':<{20}}: {int(mbs)}")
|
||||
|
||||
if self.phys_address:
|
||||
print(f"{'physical address':<{20}}: {self.phys_address}")
|
||||
|
||||
if self.ipv4_addr:
|
||||
first = True
|
||||
for addr in self.ipv4_addr:
|
||||
origin = f"({addr['origin']})" if addr.get('origin') else ""
|
||||
key = 'ipv4 addresses' if first else ''
|
||||
colon = ':' if first else ' '
|
||||
row = f"{key:<{20}}{colon} "
|
||||
row += f"{addr['ip']}/{addr['prefix-length']} {origin}"
|
||||
print(row)
|
||||
first = False
|
||||
else:
|
||||
print(f"{'ipv4 addresses':<{20}}:")
|
||||
|
||||
if self.ipv6_addr:
|
||||
first = True
|
||||
for addr in self.ipv6_addr:
|
||||
origin = f"({addr['origin']})" if addr.get('origin') else ""
|
||||
key = 'ipv6 addresses' if first else ''
|
||||
colon = ':' if first else ' '
|
||||
row = f"{key:<{20}}{colon} "
|
||||
row += f"{addr['ip']}/{addr['prefix-length']} {origin}"
|
||||
print(row)
|
||||
first = False
|
||||
else:
|
||||
print(f"{'ipv6 addresses':<{20}}:")
|
||||
|
||||
if self.in_octets and self.out_octets:
|
||||
print(f"{'in-octets':<{20}}: {self.in_octets}")
|
||||
print(f"{'out-octets':<{20}}: {self.out_octets}")
|
||||
|
||||
frame = get_json_data([], self.data,'ieee802-ethernet-interface:ethernet',
|
||||
'statistics', 'frame')
|
||||
if frame:
|
||||
print(f"")
|
||||
for key, val in frame.items():
|
||||
print(f"eth-{key:<{25}}: {val}")
|
||||
|
||||
|
||||
def find_iface(_ifaces, name):
|
||||
for _iface in [Iface(data) for data in _ifaces]:
|
||||
if _iface.name == name:
|
||||
return _iface
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def pr_interface_list(json):
|
||||
hdr = (f"{'INTERFACE':<{Pad.iface}}"
|
||||
f"{'PROTOCOL':<{Pad.proto}}"
|
||||
f"{'STATE':<{Pad.state}}"
|
||||
f"{'DATA':<{Pad.data}}")
|
||||
|
||||
print(Decore.invert(hdr))
|
||||
|
||||
ifaces = sorted(json["ietf-interfaces:interfaces"]["interface"], key=lambda x: x['name'])
|
||||
|
||||
for iface in [Iface(data) for data in ifaces]:
|
||||
if iface.is_bridge():
|
||||
iface.pr_bridge(ifaces)
|
||||
continue
|
||||
|
||||
if iface.is_veth():
|
||||
iface.pr_veth(ifaces)
|
||||
continue
|
||||
|
||||
if iface.is_vlan():
|
||||
iface.pr_vlan(ifaces)
|
||||
continue
|
||||
|
||||
# These interfaces are printed by there parent, such as bridge
|
||||
if iface.lower_if:
|
||||
continue
|
||||
if iface.bridge:
|
||||
continue
|
||||
|
||||
iface.pr_name()
|
||||
iface.pr_proto_eth()
|
||||
iface.pr_proto_ipv4()
|
||||
iface.pr_proto_ipv6()
|
||||
|
||||
def ietf_interfaces(json, name):
|
||||
if name:
|
||||
if not json.get("ietf-interfaces:interfaces"):
|
||||
print(f"No interface data found for \"{name}\"")
|
||||
sys.exit(1)
|
||||
iface = find_iface(json["ietf-interfaces:interfaces"]["interface"], name)
|
||||
if not iface:
|
||||
print(f"Interface \"{name}\" not found")
|
||||
sys.exit(1)
|
||||
iface.pr_iface()
|
||||
else:
|
||||
if not json.get("ietf-interfaces:interfaces"):
|
||||
print(f"Error, top level \"ietf-interfaces:interfaces\" missing")
|
||||
sys.exit(1)
|
||||
pr_interface_list(json)
|
||||
|
||||
def ietf_routing(json, protocol="ipv4"):
|
||||
if not json.get("ietf-routing:routing"):
|
||||
print(f"Error, top level \"ietf-routing:routing\" missing")
|
||||
sys.exit(1)
|
||||
routes = get_json_data({}, json, 'ietf-routing:routing','ribs', 'rib')[0]
|
||||
routes = get_json_data(None, routes, "routes", "route")
|
||||
|
||||
hdr = (f"{'PREFIX':<{PadRoute.prefix}}"
|
||||
f"{'NEXT-HOP':<{PadRoute.next_hop}}"
|
||||
f"{'METRIC':<{PadRoute.metric}}"
|
||||
f"{'PROTOCOL':<{PadRoute.protocol}}")
|
||||
|
||||
print(Decore.invert(hdr))
|
||||
|
||||
if routes:
|
||||
for r in routes:
|
||||
route = Route(r)
|
||||
route.print()
|
||||
|
||||
def find_slot(_slots, name):
|
||||
for _slot in [Software(data) for data in _slots]:
|
||||
if _slot.name == name:
|
||||
return _slot
|
||||
|
||||
return False
|
||||
|
||||
def infix_system(json, name):
|
||||
if not json.get("ietf-system:system-state", "infix-system:software"):
|
||||
print("Error, cannot find infix-system:software")
|
||||
sys.exit(1)
|
||||
|
||||
slots = get_json_data({}, json, 'ietf-system:system-state', 'infix-system:software', 'slot')
|
||||
if name:
|
||||
slot = find_slot(slots, name)
|
||||
if slot:
|
||||
slot.detail()
|
||||
else:
|
||||
hdr = (f"{'NAME':<{PadSoftware.name}}"
|
||||
f"{'STATE':<{PadSoftware.state}}"
|
||||
f"{'VERSION':<{PadSoftware.version}}"
|
||||
f"{'DATE':<{PadSoftware.date}}")
|
||||
print(Decore.invert(hdr))
|
||||
for _s in slots:
|
||||
slot = Software(_s)
|
||||
if slot.is_rootfs():
|
||||
slot.print()
|
||||
|
||||
def main():
|
||||
try:
|
||||
json_data = json.load(sys.stdin)
|
||||
except json.JSONDecodeError:
|
||||
print("Error, invalid JSON input")
|
||||
sys.exit(1)
|
||||
except Exception as e:
|
||||
print("Error, unexpected error parsing JSON")
|
||||
sys.exit(1)
|
||||
|
||||
if args.module == "ietf-interfaces":
|
||||
sys.exit(ietf_interfaces(json_data, args.name))
|
||||
if args.module == "ietf-routing":
|
||||
sys.exit(ietf_routing(json_data, args.name))
|
||||
if args.module == "infix-system":
|
||||
sys.exit(infix_system(json_data, args.name))
|
||||
else:
|
||||
print(f"Error, unknown module {args.module}")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import subprocess
|
||||
import sys
|
||||
import json
|
||||
|
||||
def get_ethtool_output(interface):
|
||||
try:
|
||||
output = subprocess.check_output(['ethtool', interface], stderr=subprocess.DEVNULL, text=True)
|
||||
return output.splitlines()
|
||||
except subprocess.CalledProcessError:
|
||||
print("Error: Failed to run ethtool on interface", interface)
|
||||
sys.exit(1)
|
||||
|
||||
def parse_ethtool_output(lines, keys):
|
||||
result = {}
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
key = line.split(':', 1)[0].strip()
|
||||
if key in keys:
|
||||
key, value = line.split(':', 1)
|
||||
result[key.strip()] = value.strip()
|
||||
return result
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) != 2:
|
||||
print(f"Usage: {sys.argv[0]} INTERFACE")
|
||||
sys.exit(1)
|
||||
|
||||
interface = sys.argv[1]
|
||||
keys = ["Duplex", "Auto-negotiation"]
|
||||
|
||||
lines = get_ethtool_output(interface)
|
||||
parsed_data = parse_ethtool_output(lines, keys)
|
||||
|
||||
print(json.dumps(parsed_data, indent=4))
|
||||
@@ -1,43 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
gen_interface()
|
||||
{
|
||||
cat <<EOF
|
||||
,{
|
||||
"name": "$1",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"ietf-ip:ipv6": {
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
phys_ifaces=$(ip -d -j link show | jq -r '
|
||||
.[] |
|
||||
select(.link_type == "ether") |
|
||||
select(.group != "internal") |
|
||||
select(has("parentbus")) |
|
||||
.ifname')
|
||||
|
||||
cat <<EOF
|
||||
{
|
||||
"ietf-interfaces:interfaces": {
|
||||
"interface": [
|
||||
{
|
||||
"name": "lo",
|
||||
"type": "infix-if-type:loopback",
|
||||
"ietf-ip:ipv4": {
|
||||
"address": [{ "ip": "127.0.0.1", "prefix-length": 8 }]
|
||||
},
|
||||
"ietf-ip:ipv6": {
|
||||
"address": [{ "ip": "::1", "prefix-length": 128 }]
|
||||
}
|
||||
}
|
||||
$(for iface in $phys_ifaces; do gen_interface $iface; done)
|
||||
]
|
||||
}
|
||||
}
|
||||
EOF
|
||||
@@ -1,127 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
CYAN='\033[0;36m' # Used in headers
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
GREY_BG="\e[48;5;235m"
|
||||
RESET="\e[0m"
|
||||
|
||||
HEADER_WIDHT=80
|
||||
declare -A IETF_TYPE_MAP
|
||||
|
||||
IETF_TYPE_MAP["iana-if-type:softwareLoopback"]="loopback"
|
||||
IETF_TYPE_MAP["iana-if-type:ethernetCsmacd"]="ethernet"
|
||||
IETF_TYPE_MAP["iana-if-type:l2vlan"]="vlan"
|
||||
IETF_TYPE_MAP["infix-if-type:veth"]="veth"
|
||||
IETF_TYPE_MAP["iana-if-type:bridge"]="bridge"
|
||||
|
||||
usage() {
|
||||
printf "Please provide a valid base field as the first argument\n"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
json=$(cat)
|
||||
|
||||
show_ietf_interface() {
|
||||
name="$1"
|
||||
shift
|
||||
|
||||
iface=$(echo "$json" | jq --arg name "$name" \
|
||||
'.["ietf-interfaces:interfaces"].interface[] | select(.name == $name)')
|
||||
if [ -z "$iface" ]; then
|
||||
printf "Error, interface named \"$name\" not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf "%-20s : %s\n" "name" "$name"
|
||||
printf "%-20s : %s\n" "interface-index" "$(echo "$iface" | jq -r '.["if-index"]')"
|
||||
printf "%-20s : %s\n" "operational-status" "$(echo "$iface" | jq -r '.["oper-status"]')"
|
||||
printf "%-20s : %s\n" "physical-address" "$(echo "$iface" | jq -r '.["phys-address"]')"
|
||||
|
||||
# MTU isn't set for loopback
|
||||
mtu="$(echo "$iface" | jq -r '.["ietf-ip:ipv4"] | select(.mtu != null) | .mtu')"
|
||||
if [ -n "$mtu" ]; then
|
||||
printf "%-20s : %s\n" "mtu" "$mtu"
|
||||
fi
|
||||
|
||||
printf "\n${CYAN}%-5s${NC}\n" "ipv4:"
|
||||
addresses=$(echo "$iface" | jq -c --arg field "$field" '.["ietf-ip:ipv4"].address[]' 2>/dev/null)
|
||||
for addr in $addresses; do
|
||||
ip="$(echo "$addr" | jq -r '."ip"')"
|
||||
prefix="$(echo "$addr" | jq -r '."prefix-length"')"
|
||||
printf "%-5s %s/%s\n" "" "$ip" "$prefix"
|
||||
done
|
||||
|
||||
printf "\n${CYAN}%-5s %5s\n${NC}" "in:" "octets"
|
||||
printf "%-5s %s\n" "" "$(echo "$iface" | jq -r '.statistics["in-octets"]')"
|
||||
|
||||
printf "\n${CYAN}%-5s %5s${NC}\n" "out:" "octets"
|
||||
printf "%-5s %s\n" "" "$(echo "$iface" | jq -r '.statistics["out-octets"]')"
|
||||
}
|
||||
|
||||
show_ietf_interfaces() {
|
||||
field="ietf-interfaces:interfaces"
|
||||
|
||||
if [ $# -ne 0 ]; then
|
||||
show_ietf_interface "$1"
|
||||
return
|
||||
fi
|
||||
|
||||
interfaces=$(echo "$json" | jq -c --arg field "$field" '.[$field].interface[]')
|
||||
|
||||
HEADER=$(printf "%-15s %-14s %-25s %s\n" "INTERFACE" "STATE" "PROTOCOL/ADDRESS" "SOURCE")
|
||||
HEADER_LEN=${#HEADER}
|
||||
RIGHT_PADDING=$(( HEADER_WIDHT - HEADER_LEN ))
|
||||
|
||||
printf "${GREY_BG}%s%${RIGHT_PADDING}s${RESET}\n" "$HEADER" ""
|
||||
|
||||
for iface in $interfaces; do
|
||||
name="$(echo "$iface" | jq -r '.["name"]')"
|
||||
state="$(echo "$iface" | jq -r '.["oper-status"]')"
|
||||
mac="$(echo "$iface" | jq -r '.["phys-address"]')"
|
||||
type="$(echo "$iface" | jq -r '.["type"]')"
|
||||
state_color=""
|
||||
|
||||
if [[ -v IETF_TYPE_MAP["$type"] ]]; then
|
||||
src="${IETF_TYPE_MAP["$type"]}"
|
||||
else
|
||||
src="unknown"
|
||||
fi
|
||||
|
||||
if [ "$state" = "up" ]; then
|
||||
state_color="$GREEN"
|
||||
elif [ "$state" = "down" ]; then
|
||||
state_color="$RED"
|
||||
fi
|
||||
printf "%-15s ${state_color}%-15s${NC}%s" "$name" "$state"
|
||||
|
||||
addresses=$(echo "$iface" | jq -c --arg field "$field" '.["ietf-ip:ipv4"].address[]' 2>/dev/null)
|
||||
printf "%-25s %s\n" "$mac" "$src"
|
||||
for addr in $addresses; do
|
||||
ip="$(echo "$addr" | jq -r '."ip"')"
|
||||
prefix="$(echo "$addr" | jq -r '."prefix-length"')"
|
||||
printf "%-30s %s/%s\n" "" "$ip" "$prefix"
|
||||
done
|
||||
if [ -n "$addresses" ]; then
|
||||
printf "\n"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
field="$1"
|
||||
shift
|
||||
|
||||
case "$field" in
|
||||
"ietf-interfaces")
|
||||
show_ietf_interfaces $*
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
@@ -0,0 +1,405 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import subprocess
|
||||
import json
|
||||
import sys # (built-in module)
|
||||
|
||||
def json_get_yang_type(iface_in):
|
||||
if iface_in['link_type'] == "loopback":
|
||||
return "infix-if-type:loopback"
|
||||
|
||||
if iface_in['link_type'] != "ether":
|
||||
return "infix-if-type:other";
|
||||
|
||||
if not 'linkinfo' in iface_in:
|
||||
return "infix-if-type:ethernet"
|
||||
|
||||
if not 'info_kind' in iface_in['linkinfo']:
|
||||
return "infix-if-type:ethernet";
|
||||
|
||||
if iface_in['linkinfo']['info_kind'] == "veth":
|
||||
return "infix-if-type:veth";
|
||||
|
||||
if iface_in['linkinfo']['info_kind'] == "vlan":
|
||||
return "infix-if-type:vlan";
|
||||
|
||||
if iface_in['linkinfo']['info_kind'] == "bridge":
|
||||
return "infix-if-type:bridge";
|
||||
|
||||
if iface_in['linkinfo']['info_kind'] == "dsa":
|
||||
return "infix-if-type:ethernet";
|
||||
|
||||
# Fallback
|
||||
return "infix-if-type:ethernet";
|
||||
|
||||
def json_get_yang_origin(addr):
|
||||
map = {
|
||||
"kernel_ll": "link-layer",
|
||||
"kernel_ra": "link-layer",
|
||||
"static": "static",
|
||||
"dhcp": "dhcp",
|
||||
"random": "random",
|
||||
}
|
||||
proto = addr['protocol']
|
||||
|
||||
if proto == "kernel_ll" or proto == "kernel_ra":
|
||||
if "stable-privacy" in addr:
|
||||
return "random"
|
||||
|
||||
return map.get(proto, "other")
|
||||
|
||||
def get_proc_value(procfile):
|
||||
try:
|
||||
with open(procfile, 'r') as file:
|
||||
data = file.read().strip()
|
||||
return data
|
||||
except FileNotFoundError:
|
||||
# This is considered OK
|
||||
return None
|
||||
except IOError:
|
||||
print(f"Error: reading from {procfile}", file=sys.stderr)
|
||||
|
||||
# This function returns a value from a nested json dict
|
||||
def lookup(json, *keys):
|
||||
curr = json
|
||||
for key in keys:
|
||||
if isinstance(curr, dict) and key in curr:
|
||||
curr = curr[key]
|
||||
else:
|
||||
return None
|
||||
return curr
|
||||
|
||||
# This function inserts a value into a nested json dict
|
||||
def insert(json, *path_and_value):
|
||||
if len(path_and_value) < 2:
|
||||
raise ValueError("Error: insert() takes at least two args")
|
||||
|
||||
*path, value = path_and_value
|
||||
|
||||
curr = json
|
||||
for key in path[:-1]:
|
||||
if key not in curr or not isinstance(curr[key], dict):
|
||||
curr[key] = {}
|
||||
curr = curr[key]
|
||||
|
||||
curr[path[-1]] = value
|
||||
|
||||
def run_cmd(cmd):
|
||||
try:
|
||||
output = subprocess.check_output(cmd, stderr=subprocess.DEVNULL, text=True)
|
||||
return output.splitlines()
|
||||
except subprocess.CalledProcessError:
|
||||
print(f"Error: command returned error", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
def run_json_cmd(cmd):
|
||||
try:
|
||||
result = subprocess.run(cmd, check=True, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE, text=True)
|
||||
output = result.stdout
|
||||
data = json.loads(output)
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"Error: unable to get data:", file=sys.stderr)
|
||||
print(f"{e.stderr}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"Error: parsing JSON output: {e.msg}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
return data
|
||||
|
||||
def iface_is_dsa(iface_in):
|
||||
if not "linkinfo" in iface_in:
|
||||
return False
|
||||
if not "info_kind" in iface_in['linkinfo']:
|
||||
return False
|
||||
if iface_in['linkinfo']['info_kind'] != "dsa":
|
||||
return False
|
||||
return True
|
||||
|
||||
def add_ipv4_route(routes):
|
||||
cmd = ['ip', '-4', '-s', '-d', '-j', 'route']
|
||||
data = run_json_cmd(cmd)
|
||||
out={}
|
||||
out["route"] = []
|
||||
|
||||
for d in data:
|
||||
new = {}
|
||||
next_hop = {}
|
||||
if(d['dst'] == "default"):
|
||||
d['dst'] = "0.0.0.0/0"
|
||||
if(d['dst'].find('/') == -1):
|
||||
d['dst'] = d['dst']+"/32"
|
||||
new['ietf-ipv4-unicast-routing:destination-prefix'] = d['dst']
|
||||
new['source-protocol'] = "infix-routing:"+d['protocol']
|
||||
if d.get("metric"):
|
||||
new['route-preference'] = d['metric']
|
||||
else:
|
||||
new['route-preference'] = 0
|
||||
|
||||
if d['type'] == "blackhole":
|
||||
next_hop['special-next-hop'] = "blackhole"
|
||||
if d['type'] == "unreachable":
|
||||
next_hop['special-next-hop'] = "unreachable"
|
||||
|
||||
if d['type'] == "unicast":
|
||||
if(d.get("gateway")):
|
||||
next_hop['ietf-ipv4-unicast-routing:next-hop-address'] = d['gateway']
|
||||
elif(d.get("dev")):
|
||||
next_hop['outgoing-interface'] = d['dev']
|
||||
|
||||
new['next-hop'] = next_hop
|
||||
|
||||
out['route'].append(new)
|
||||
insert(routes, 'routes', out)
|
||||
|
||||
def add_ip_link(ifname, iface_out):
|
||||
cmd = ['ip', '-s', '-d', '-j', 'link', 'show', 'dev', ifname]
|
||||
|
||||
data = run_json_cmd(cmd)
|
||||
if len(data) != 1:
|
||||
print(f"Error: expected ip link output to be array with length 1", file=sys.stderr)
|
||||
sys,exit(1)
|
||||
|
||||
iface_in = data[0]
|
||||
|
||||
if 'ifname' in iface_in:
|
||||
iface_out['name'] = iface_in['ifname']
|
||||
|
||||
if 'ifindex' in iface_in:
|
||||
iface_out['if-index'] = iface_in['ifindex']
|
||||
|
||||
if 'address' in iface_in:
|
||||
iface_out['phys-address'] = iface_in['address']
|
||||
|
||||
if 'master' in iface_in:
|
||||
insert(iface_out, "infix-interfaces:bridge-port", "bridge", iface_in['master'])
|
||||
|
||||
if 'link' in iface_in and not iface_is_dsa(iface_in):
|
||||
insert(iface_out, "infix-interfaces:vlan", "lower-layer-if", iface_in['link'])
|
||||
|
||||
if 'operstate' in iface_in:
|
||||
map = {
|
||||
"DOWN": "down",
|
||||
"UP": "up",
|
||||
"DORMANT": "dormant",
|
||||
"TESTING": "testing",
|
||||
"LOWERLAYERDOWN": "lower-layer-down",
|
||||
"NOTPRESENT": "not-present"
|
||||
}
|
||||
val = map.get(iface_in['operstate'], "unknown")
|
||||
iface_out['oper-status'] = val
|
||||
|
||||
if 'link_type' in iface_in:
|
||||
val = json_get_yang_type(iface_in)
|
||||
iface_out['type'] = val
|
||||
|
||||
val = lookup(iface_in, "stats64", "rx", "bytes")
|
||||
if val is not None:
|
||||
insert(iface_out, "statistics", "out-octets", str(val))
|
||||
|
||||
val = lookup(iface_in, "stats64", "tx", "bytes")
|
||||
if val is not None:
|
||||
insert(iface_out, "statistics", "in-octets", str(val))
|
||||
|
||||
def add_ip_addr(ifname, iface_out):
|
||||
cmd = ['ip', '-j', 'addr', 'show', 'dev', ifname]
|
||||
|
||||
data = run_json_cmd(cmd)
|
||||
if len(data) != 1:
|
||||
print(f"Error: expected ip addr output to be array with length 1", file=sys.stderr)
|
||||
sys,exit(1)
|
||||
|
||||
iface_in = data[0]
|
||||
|
||||
if 'mtu' in iface_in and ifname != "lo":
|
||||
insert(iface_out, "ietf-ip:ipv4", "mtu", iface_in['mtu'])
|
||||
|
||||
# We avoid importing os to check if the file exists (for performance)
|
||||
val = get_proc_value(f"/proc/sys/net/ipv6/conf/{ifname}/mtu")
|
||||
if val is not None:
|
||||
insert(iface_out, "ietf-ip:ipv6", "mtu", int(val))
|
||||
|
||||
if 'addr_info' in iface_in:
|
||||
inet = []
|
||||
inet6 = []
|
||||
|
||||
for addr in iface_in['addr_info']:
|
||||
new = {}
|
||||
|
||||
if not 'family' in addr:
|
||||
print(f"Error: 'family' missing from 'addr_info'", file=sys.stderr)
|
||||
continue
|
||||
|
||||
if 'local' in addr:
|
||||
new['ip'] = addr['local']
|
||||
if 'prefixlen' in addr:
|
||||
new['prefix-length'] = addr['prefixlen']
|
||||
if 'protocol' in addr:
|
||||
new['origin'] = json_get_yang_origin(addr)
|
||||
|
||||
if addr['family'] == "inet":
|
||||
inet.append(new)
|
||||
elif addr['family'] == "inet6":
|
||||
inet6.append(new)
|
||||
else:
|
||||
print(f"Error: invalid 'family' in 'addr_info'", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
insert(iface_out, "ietf-ip:ipv4", "address", inet)
|
||||
insert(iface_out, "ietf-ip:ipv6", "address", inet6)
|
||||
|
||||
def add_ethtool_groups(ifname, iface_out):
|
||||
cmd = ['ethtool', '--json', '-S', ifname, '--all-groups']
|
||||
|
||||
data = run_json_cmd(cmd)
|
||||
if len(data) != 1:
|
||||
print(f"Error: expected ethtool groups output to be array with length 1", file=sys.stderr)
|
||||
sys,exit(1)
|
||||
|
||||
iface_in = data[0]
|
||||
|
||||
# TODO: room for improvement here, the "frame" creation could be more dynamic.
|
||||
if "eth-mac" in iface_in or "rmon" in iface_in:
|
||||
insert(iface_out, "ieee802-ethernet-interface:ethernet", "statistics", "frame", {})
|
||||
frame = iface_out['ieee802-ethernet-interface:ethernet']['statistics']['frame']
|
||||
|
||||
if "eth-mac" in iface_in:
|
||||
mac_in = iface_in['eth-mac']
|
||||
|
||||
if "FramesTransmittedOK" in mac_in:
|
||||
frame['out-frames'] = str(mac_in['FramesTransmittedOK'])
|
||||
if "MulticastFramesXmittedOK" in mac_in:
|
||||
frame['out-multicast-frames'] = str(mac_in['MulticastFramesXmittedOK'])
|
||||
if "BroadcastFramesXmittedOK" in mac_in:
|
||||
frame['out-broadcast-frames'] = str(mac_in['BroadcastFramesXmittedOK'])
|
||||
if "FramesReceivedOK" in mac_in:
|
||||
frame['in-frames'] = str(mac_in['FramesReceivedOK'])
|
||||
if "MulticastFramesReceivedOK" in mac_in:
|
||||
frame['in-multicast-frames'] = str(mac_in['MulticastFramesReceivedOK'])
|
||||
if "BroadcastFramesReceivedOK" in mac_in:
|
||||
frame['in-broadcast-frames'] = str(mac_in['BroadcastFramesReceivedOK'])
|
||||
if "FrameCheckSequenceErrors" in mac_in:
|
||||
frame['in-error-fcs-frames'] = str(mac_in['FrameCheckSequenceErrors'])
|
||||
if "FramesLostDueToIntMACRcvError" in mac_in:
|
||||
frame['in-error-mac-internal-frames'] = str(mac_in['FramesLostDueToIntMACRcvError'])
|
||||
|
||||
tot = 0
|
||||
found = False
|
||||
if "FramesReceivedOK" in mac_in:
|
||||
tot += mac_in['FramesReceivedOK']
|
||||
found = True
|
||||
if "FrameCheckSequenceErrors" in mac_in:
|
||||
tot += mac_in['FrameCheckSequenceErrors']
|
||||
found = True
|
||||
if "FramesLostDueToIntMACRcvError" in mac_in:
|
||||
tot += mac_in['FramesLostDueToIntMACRcvError']
|
||||
found = True
|
||||
if "AlignmentErrors" in mac_in:
|
||||
tot += mac_in['AlignmentErrors']
|
||||
found = True
|
||||
if "etherStatsOversizePkts" in mac_in:
|
||||
tot += mac_in['etherStatsOversizePkts']
|
||||
found = True
|
||||
if "etherStatsJabbers" in mac_in:
|
||||
tot += mac_in['etherStatsJabbers']
|
||||
found = True
|
||||
if found:
|
||||
frame['in-total-frames'] = str(tot)
|
||||
|
||||
if "rmon" in iface_in:
|
||||
rmon_in = iface_in['rmon']
|
||||
|
||||
if "undersize_pkts" in rmon_in:
|
||||
frame['in-error-undersize-frames'] = str(rmon_in['undersize_pkts'])
|
||||
|
||||
tot = 0
|
||||
found = False
|
||||
if "etherStatsJabbers" in rmon_in:
|
||||
tot += rmon_in['etherStatsJabbers']
|
||||
found = True
|
||||
if "etherStatsOversizePkts" in rmon_in:
|
||||
tot += rmon_in['etherStatsOversizePkts']
|
||||
found = True
|
||||
if found:
|
||||
frame['in-error-oversize-frames'] = str(tot)
|
||||
|
||||
def add_ethtool_std(ifname, iface_out):
|
||||
cmd = ['ethtool', ifname]
|
||||
keys = ['Speed', 'Duplex', 'Auto-negotiation']
|
||||
result = {}
|
||||
|
||||
lines = run_cmd(cmd)
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
key = line.split(':', 1)[0].strip()
|
||||
if key in keys:
|
||||
key, value = line.split(':', 1)
|
||||
result[key.strip()] = value.strip()
|
||||
|
||||
if "Auto-negotiation" in result:
|
||||
if result['Auto-negotiation'] == "on":
|
||||
insert(iface_out, "ieee802-ethernet-interface:ethernet", "auto-negotiation", "enable", True)
|
||||
else:
|
||||
insert(iface_out, "ieee802-ethernet-interface:ethernet", "auto-negotiation", "enable", False)
|
||||
|
||||
if "Duplex" in result:
|
||||
if result['Duplex'] == "Half":
|
||||
insert(iface_out, "ieee802-ethernet-interface:ethernet", "duplex", "half")
|
||||
elif result['Duplex'] == "Full":
|
||||
insert(iface_out, "ieee802-ethernet-interface:ethernet", "duplex", "full")
|
||||
else:
|
||||
insert(iface_out, "ieee802-ethernet-interface:ethernet", "duplex", "unknown")
|
||||
|
||||
if "Speed" in result and result['Speed'] != "Unknown!":
|
||||
# Avoid importing re (performance)
|
||||
num = ''.join(filter(str.isdigit, result['Speed']))
|
||||
if num:
|
||||
num = round((int(num) / 1000), 3)
|
||||
insert(iface_out, "ieee802-ethernet-interface:ethernet", "speed", str(num))
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) < 2:
|
||||
print(f"usage: yanger <model> [params]", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
model = sys.argv[1]
|
||||
if(model == 'ietf-interfaces'):
|
||||
# For now, we handle each interface separately, as this is how it's
|
||||
# currently implemented in sysrepo. I.e sysrepo will subscribe to
|
||||
# each individual interface and query it for YANG data.
|
||||
|
||||
if len(sys.argv) != 3:
|
||||
print(f"usage: yanger ietf-interfaces IFNAME", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
yang_data = {
|
||||
"ietf-interfaces:interfaces": {
|
||||
"interface": [{}]
|
||||
}
|
||||
}
|
||||
|
||||
ifname = sys.argv[2]
|
||||
iface_out = yang_data['ietf-interfaces:interfaces']['interface'][0]
|
||||
|
||||
add_ip_link(ifname, iface_out)
|
||||
add_ip_addr(ifname, iface_out)
|
||||
add_ethtool_groups(ifname, iface_out)
|
||||
add_ethtool_std(ifname, iface_out)
|
||||
elif(model == 'ietf-routing'):
|
||||
yang_data = {
|
||||
"ietf-routing:routing": {
|
||||
"ribs": {
|
||||
"rib": [{
|
||||
"name": "ipv4",
|
||||
"address-family": "ipv4",
|
||||
}]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ipv4routes = yang_data['ietf-routing:routing']['ribs']['rib'][0]
|
||||
add_ipv4_route(ipv4routes);
|
||||
else:
|
||||
print(f"Unsupported model {model}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
print(json.dumps(yang_data, indent=2))
|
||||
@@ -1,5 +1,6 @@
|
||||
test-dir := $(BR2_EXTERNAL_INFIX_PATH)/test
|
||||
INFIX_TESTS ?= $(test-dir)/case/all.yaml
|
||||
INFIX_TESTS ?= $(test-dir)/case/all-repo.yaml $(test-dir)/case/all-unit.yaml \
|
||||
$(test-dir)/case/all.yaml
|
||||
|
||||
test-env = $(test-dir)/env \
|
||||
-f $(BINARIES_DIR)/infix-x86_64.img \
|
||||
|
||||
@@ -229,6 +229,13 @@ CONFIG_USB_XHCI_HCD=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_UHCI_HCD=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_TRIGGERS=y
|
||||
CONFIG_LEDS_TRIGGER_TIMER=y
|
||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
||||
CONFIG_LEDS_TRIGGER_ACTIVITY=y
|
||||
CONFIG_LEDS_TRIGGER_NETDEV=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_SYNC_FILE=y
|
||||
CONFIG_VIRTIO_PCI=y
|
||||
|
||||
@@ -21,14 +21,19 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/classic/post-build.sh"
|
||||
BR2_ROOTFS_POST_IMAGE_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-image.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.5.11"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/aarch64/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_DTS_SUPPORT=y
|
||||
BR2_LINUX_KERNEL_INTREE_DTS_NAME="marvell/armada-3720-espressobin marvell/armada-3720-espressobin-emmc marvell/armada-3720-espressobin-v7 marvell/armada-3720-espressobin-v7-emmc marvell/armada-3720-espressobin-ultra marvell/cn9130-crb-A marvell/cn9130-crb-B sparx5_pcb135_emmc_no_psci"
|
||||
BR2_LINUX_KERNEL_CUSTOM_DTS_PATH="${BR2_EXTERNAL_INFIX_PATH}/board/aarch64/dts/microchip/sparx5_pcb135_emmc_no_psci.dts"
|
||||
BR2_LINUX_KERNEL_INTREE_DTS_NAME="alder/alder marvell/armada-3720-espressobin marvell/armada-3720-espressobin-emmc marvell/armada-3720-espressobin-v7 marvell/armada-3720-espressobin-v7-emmc marvell/armada-3720-espressobin-ultra marvell/cn9130-crb-A marvell/cn9130-crb-B microchip/sparx5_pcb135_emmc_no_psci"
|
||||
BR2_LINUX_KERNEL_CUSTOM_DTS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/aarch64/dts"
|
||||
BR2_LINUX_KERNEL_DTB_KEEP_DIRNAME=y
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
BR2_PACKAGE_BUSYBOX_CONFIG="${BR2_EXTERNAL_INFIX_PATH}/board/common/busybox_defconfig"
|
||||
BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
|
||||
BR2_PACKAGE_STRACE=y
|
||||
BR2_PACKAGE_STRESS_NG=y
|
||||
BR2_PACKAGE_JQ=y
|
||||
BR2_PACKAGE_MDIO_TOOLS=y
|
||||
BR2_PACKAGE_RNG_TOOLS=y
|
||||
@@ -44,6 +49,7 @@ BR2_PACKAGE_AVAHI=y
|
||||
# BR2_PACKAGE_AVAHI_AUTOIPD is not set
|
||||
BR2_PACKAGE_AVAHI_DAEMON=y
|
||||
BR2_PACKAGE_AVAHI_DEFAULT_SERVICES=y
|
||||
BR2_PACKAGE_CHRONY=y
|
||||
BR2_PACKAGE_DHCPCD=y
|
||||
BR2_PACKAGE_DNSMASQ=y
|
||||
BR2_PACKAGE_DROPBEAR=y
|
||||
@@ -67,7 +73,6 @@ BR2_PACKAGE_NMAP_NMAP=y
|
||||
BR2_PACKAGE_NMAP_NPING=y
|
||||
BR2_PACKAGE_OPENRESOLV=y
|
||||
BR2_PACKAGE_SOCAT=y
|
||||
BR2_PACKAGE_SSDP_RESPONDER=y
|
||||
BR2_PACKAGE_TCPDUMP=y
|
||||
BR2_PACKAGE_TRACEROUTE=y
|
||||
BR2_PACKAGE_DIALOG=y
|
||||
@@ -94,6 +99,10 @@ BR2_PACKAGE_HOST_RAUC=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
|
||||
INFIX_VENDOR_HOME="https://github.com/kernelkit"
|
||||
INFIX_DESC="Infix is a Network Operating System based on Linux. It can be set up both as a switch, with offloading using switchdev, and a router with firewalling."
|
||||
INFIX_HOME="https://github.com/kernelkit/infix/"
|
||||
INFIX_DOC="https://github.com/kernelkit/infix/tree/main/doc"
|
||||
INFIX_VARIANT_CLASSIC=y
|
||||
BR2_PACKAGE_FACTORY=y
|
||||
BR2_PACKAGE_FINIT_SULOGIN=y
|
||||
|
||||
@@ -13,7 +13,7 @@ BR2_TARGET_GENERIC_ISSUE="Infix by KernelKit"
|
||||
BR2_INIT_FINIT=y
|
||||
BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
|
||||
BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt ${BR2_EXTERNAL_INFIX_PATH}/board/common/xattrs ${BR2_EXTERNAL_INFIX_PATH}/board/netconf/xattrs"
|
||||
BR2_SYSTEM_BIN_SH_BASH=y
|
||||
# BR2_TARGET_ENABLE_ROOT_LOGIN is not set
|
||||
BR2_TARGET_GENERIC_GETTY_TERM="xterm"
|
||||
BR2_SYSTEM_DHCP="eth0"
|
||||
BR2_ENABLE_LOCALE_WHITELIST="C en_US en_CA"
|
||||
@@ -23,11 +23,13 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/netconf/post-build.sh"
|
||||
BR2_ROOTFS_POST_IMAGE_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-image.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.5.11"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/aarch64/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_DTS_SUPPORT=y
|
||||
BR2_LINUX_KERNEL_INTREE_DTS_NAME="marvell/armada-3720-espressobin marvell/armada-3720-espressobin-emmc marvell/armada-3720-espressobin-v7 marvell/armada-3720-espressobin-v7-emmc marvell/armada-3720-espressobin-ultra marvell/cn9130-crb-A marvell/cn9130-crb-B sparx5_pcb135_emmc_no_psci"
|
||||
BR2_LINUX_KERNEL_CUSTOM_DTS_PATH="${BR2_EXTERNAL_INFIX_PATH}/board/aarch64/dts/microchip/sparx5_pcb135_emmc_no_psci.dts"
|
||||
BR2_LINUX_KERNEL_INTREE_DTS_NAME="alder/alder marvell/armada-3720-espressobin marvell/armada-3720-espressobin-emmc marvell/armada-3720-espressobin-v7 marvell/armada-3720-espressobin-v7-emmc marvell/armada-3720-espressobin-ultra marvell/cn9130-crb-A marvell/cn9130-crb-B microchip/sparx5_pcb135_emmc_no_psci"
|
||||
BR2_LINUX_KERNEL_CUSTOM_DTS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/aarch64/dts"
|
||||
BR2_LINUX_KERNEL_DTB_KEEP_DIRNAME=y
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
BR2_PACKAGE_BUSYBOX_CONFIG="${BR2_EXTERNAL_INFIX_PATH}/board/common/busybox_defconfig"
|
||||
@@ -35,17 +37,22 @@ BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
|
||||
BR2_PACKAGE_STRACE=y
|
||||
BR2_PACKAGE_STRESS_NG=y
|
||||
BR2_PACKAGE_JQ=y
|
||||
BR2_PACKAGE_MDIO_TOOLS=y
|
||||
BR2_PACKAGE_E2FSPROGS=y
|
||||
BR2_PACKAGE_DBUS_CXX=y
|
||||
BR2_PACKAGE_DBUS_GLIB=y
|
||||
BR2_PACKAGE_DBUS_TRIGGERD=y
|
||||
BR2_PACKAGE_EUDEV_RULES_GEN=y
|
||||
# BR2_PACKAGE_EUDEV_ENABLE_HWDB is not set
|
||||
BR2_PACKAGE_GPTFDISK=y
|
||||
BR2_PACKAGE_GPTFDISK_SGDISK=y
|
||||
BR2_PACKAGE_MDIO_TOOLS=y
|
||||
BR2_PACKAGE_RNG_TOOLS=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS_FIT_SUPPORT=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS_FIT_CHECK_SIGN=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS_MKENVIMAGE=y
|
||||
BR2_PACKAGE_PYTHON3=y
|
||||
BR2_PACKAGE_CA_CERTIFICATES=y
|
||||
BR2_PACKAGE_LIBOPENSSL_BIN=y
|
||||
BR2_PACKAGE_LIBCURL_CURL=y
|
||||
@@ -60,7 +67,9 @@ BR2_PACKAGE_CONNTRACK_TOOLS=y
|
||||
BR2_PACKAGE_DNSMASQ=y
|
||||
BR2_PACKAGE_ETHTOOL=y
|
||||
BR2_PACKAGE_FPING=y
|
||||
BR2_PACKAGE_FRR=y
|
||||
# BR2_PACKAGE_IFUPDOWN_SCRIPTS is not set
|
||||
BR2_PACKAGE_IPROUTE2=y
|
||||
BR2_PACKAGE_IPTABLES=y
|
||||
BR2_PACKAGE_IPTABLES_NFTABLES=y
|
||||
BR2_PACKAGE_IPUTILS=y
|
||||
@@ -76,10 +85,10 @@ BR2_PACKAGE_NMAP_NPING=y
|
||||
BR2_PACKAGE_OPENRESOLV=y
|
||||
BR2_PACKAGE_OPENSSH=y
|
||||
BR2_PACKAGE_SOCAT=y
|
||||
BR2_PACKAGE_SSDP_RESPONDER=y
|
||||
BR2_PACKAGE_TCPDUMP=y
|
||||
BR2_PACKAGE_TRACEROUTE=y
|
||||
BR2_PACKAGE_ULOGD=y
|
||||
BR2_PACKAGE_BASH=y
|
||||
BR2_PACKAGE_BASH_COMPLETION=y
|
||||
BR2_PACKAGE_IRQBALANCE=y
|
||||
BR2_PACKAGE_KMOD_TOOLS=y
|
||||
@@ -104,21 +113,25 @@ BR2_PACKAGE_HOST_RAUC=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
|
||||
INFIX_VENDOR_HOME="https://github.com/kernelkit"
|
||||
INFIX_DESC="Infix is a Network Operating System based on Linux. It can be set up both as a switch, with offloading using switchdev, and a router with firewalling."
|
||||
INFIX_HOME="https://github.com/kernelkit/infix/"
|
||||
INFIX_DOC="https://github.com/kernelkit/infix/tree/main/doc"
|
||||
INFIX_SUPPORT="mailto:kernelkit@googlegroups.com"
|
||||
BR2_PACKAGE_CONFD=y
|
||||
BR2_PACKAGE_STATD=y
|
||||
BR2_PACKAGE_FACTORY=y
|
||||
BR2_PACKAGE_FINIT_SULOGIN=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_HOTPLUG=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_HOOK_SCRIPTS=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_MODULES_LOAD=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_MODPROBE=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_RTC=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_TTY=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_URANDOM=y
|
||||
BR2_PACKAGE_IITO=y
|
||||
BR2_PACKAGE_KLISH_PLUGIN_INFIX=y
|
||||
BR2_PACKAGE_LOWDOWN=y
|
||||
BR2_PACKAGE_NET=y
|
||||
BR2_PACKAGE_TETRIS=y
|
||||
BR2_PACKAGE_QUERIERD=y
|
||||
DISK_IMAGE_BOOT_BIN=y
|
||||
GNS3_APPLIANCE_RAM=512
|
||||
GNS3_APPLIANCE_IFNUM=10
|
||||
|
||||
@@ -20,6 +20,8 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="board/qemu/x86_64/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/classic/post-build.sh"
|
||||
BR2_ROOTFS_POST_IMAGE_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-image.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.5.11"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/x86_64/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
@@ -63,7 +65,6 @@ BR2_PACKAGE_NMAP_NMAP=y
|
||||
BR2_PACKAGE_NMAP_NPING=y
|
||||
BR2_PACKAGE_OPENRESOLV=y
|
||||
BR2_PACKAGE_SOCAT=y
|
||||
BR2_PACKAGE_SSDP_RESPONDER=y
|
||||
BR2_PACKAGE_TCPDUMP=y
|
||||
BR2_PACKAGE_TRACEROUTE=y
|
||||
BR2_PACKAGE_DIALOG=y
|
||||
@@ -98,6 +99,10 @@ BR2_PACKAGE_HOST_RAUC=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
|
||||
INFIX_VENDOR_HOME="https://github.com/kernelkit"
|
||||
INFIX_DESC="Infix is a Network Operating System based on Linux. It can be set up both as a switch, with offloading using switchdev, and a router with firewalling."
|
||||
INFIX_HOME="https://github.com/kernelkit/infix/"
|
||||
INFIX_DOC="https://github.com/kernelkit/infix/tree/main/doc"
|
||||
INFIX_VARIANT_CLASSIC=y
|
||||
BR2_PACKAGE_FACTORY=y
|
||||
BR2_PACKAGE_FINIT_SULOGIN=y
|
||||
@@ -110,3 +115,4 @@ BR2_PACKAGE_FINIT_PLUGIN_TTY=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_URANDOM=y
|
||||
BR2_PACKAGE_IFUPDOWN_NG=y
|
||||
BR2_PACKAGE_TETRIS=y
|
||||
DISK_IMAGE_BOOT_BIN=y
|
||||
@@ -12,7 +12,7 @@ BR2_TARGET_GENERIC_ISSUE="Infix by KernelKit"
|
||||
BR2_INIT_FINIT=y
|
||||
BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
|
||||
BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt ${BR2_EXTERNAL_INFIX_PATH}/board/common/xattrs ${BR2_EXTERNAL_INFIX_PATH}/board/netconf/xattrs"
|
||||
BR2_SYSTEM_BIN_SH_BASH=y
|
||||
# BR2_TARGET_ENABLE_ROOT_LOGIN is not set
|
||||
BR2_TARGET_GENERIC_GETTY_TERM="xterm"
|
||||
BR2_SYSTEM_DHCP="eth0"
|
||||
BR2_ENABLE_LOCALE_WHITELIST="C en_US en_CA"
|
||||
@@ -22,6 +22,8 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="board/qemu/x86_64/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/netconf/post-build.sh"
|
||||
BR2_ROOTFS_POST_IMAGE_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-image.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.5.11"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/x86_64/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
@@ -37,11 +39,15 @@ BR2_PACKAGE_DBUS_GLIB=y
|
||||
BR2_PACKAGE_DBUS_TRIGGERD=y
|
||||
BR2_PACKAGE_EUDEV_RULES_GEN=y
|
||||
# BR2_PACKAGE_EUDEV_ENABLE_HWDB is not set
|
||||
BR2_PACKAGE_GPTFDISK=y
|
||||
BR2_PACKAGE_GPTFDISK_SGDISK=y
|
||||
BR2_PACKAGE_RNG_TOOLS=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS_FIT_SUPPORT=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS_FIT_CHECK_SIGN=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS_MKENVIMAGE=y
|
||||
BR2_PACKAGE_PYTHON3=y
|
||||
BR2_PACKAGE_CA_CERTIFICATES=y
|
||||
BR2_PACKAGE_LIBOPENSSL_BIN=y
|
||||
BR2_PACKAGE_LIBCURL_CURL=y
|
||||
@@ -56,7 +62,9 @@ BR2_PACKAGE_CONNTRACK_TOOLS=y
|
||||
BR2_PACKAGE_DNSMASQ=y
|
||||
BR2_PACKAGE_ETHTOOL=y
|
||||
BR2_PACKAGE_FPING=y
|
||||
BR2_PACKAGE_FRR=y
|
||||
# BR2_PACKAGE_IFUPDOWN_SCRIPTS is not set
|
||||
BR2_PACKAGE_IPROUTE2=y
|
||||
BR2_PACKAGE_IPTABLES=y
|
||||
BR2_PACKAGE_IPTABLES_NFTABLES=y
|
||||
BR2_PACKAGE_IPUTILS=y
|
||||
@@ -72,10 +80,10 @@ BR2_PACKAGE_NMAP_NPING=y
|
||||
BR2_PACKAGE_OPENRESOLV=y
|
||||
BR2_PACKAGE_OPENSSH=y
|
||||
BR2_PACKAGE_SOCAT=y
|
||||
BR2_PACKAGE_SSDP_RESPONDER=y
|
||||
BR2_PACKAGE_TCPDUMP=y
|
||||
BR2_PACKAGE_TRACEROUTE=y
|
||||
BR2_PACKAGE_ULOGD=y
|
||||
BR2_PACKAGE_BASH=y
|
||||
BR2_PACKAGE_BASH_COMPLETION=y
|
||||
BR2_PACKAGE_IRQBALANCE=y
|
||||
BR2_PACKAGE_KMOD_TOOLS=y
|
||||
@@ -108,20 +116,23 @@ BR2_PACKAGE_HOST_RAUC=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
|
||||
INFIX_VENDOR_HOME="https://github.com/kernelkit"
|
||||
INFIX_DESC="Infix is a Network Operating System based on Linux. It can be set up both as a switch, with offloading using switchdev, and a router with firewalling."
|
||||
INFIX_HOME="https://github.com/kernelkit/infix/"
|
||||
INFIX_DOC="https://github.com/kernelkit/infix/tree/main/doc"
|
||||
INFIX_SUPPORT="mailto:kernelkit@googlegroups.com"
|
||||
BR2_PACKAGE_CONFD=y
|
||||
BR2_PACKAGE_STATD=y
|
||||
BR2_PACKAGE_FACTORY=y
|
||||
BR2_PACKAGE_FINIT_SULOGIN=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_HOTPLUG=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_HOOK_SCRIPTS=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_MODULES_LOAD=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_MODPROBE=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_RTC=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_TTY=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_URANDOM=y
|
||||
BR2_PACKAGE_IITO=y
|
||||
BR2_PACKAGE_KLISH_PLUGIN_INFIX=y
|
||||
BR2_PACKAGE_LOWDOWN=y
|
||||
BR2_PACKAGE_NET=y
|
||||
BR2_PACKAGE_TETRIS=y
|
||||
BR2_PACKAGE_QUERIERD=y
|
||||
GNS3_APPLIANCE_RAM=512
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
BR2_x86_64=y
|
||||
BR2_x86_corei7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_GDB_SERVER_COPY=y
|
||||
BR2_DL_DIR="${BR2_EXTERNAL_INFIX_PATH}/dl"
|
||||
BR2_CCACHE=y
|
||||
BR2_CCACHE_DIR="${BR2_EXTERNAL_INFIX_PATH}/.ccache"
|
||||
BR2_ENABLE_DEBUG=y
|
||||
BR2_GLOBAL_PATCH_DIR="${BR2_EXTERNAL_INFIX_PATH}/patches"
|
||||
BR2_TARGET_GENERIC_HOSTNAME="infix"
|
||||
BR2_TARGET_GENERIC_ISSUE="Minfix by KernelKit"
|
||||
BR2_INIT_FINIT=y
|
||||
BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
|
||||
BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt ${BR2_EXTERNAL_INFIX_PATH}/board/common/xattrs ${BR2_EXTERNAL_INFIX_PATH}/board/netconf/xattrs"
|
||||
BR2_SYSTEM_BIN_SH_BASH=y
|
||||
BR2_TARGET_GENERIC_GETTY_TERM="xterm"
|
||||
BR2_SYSTEM_DHCP="eth0"
|
||||
BR2_ENABLE_LOCALE_WHITELIST="C en_US en_CA"
|
||||
BR2_GENERATE_LOCALE="en_US en_CA"
|
||||
BR2_TARGET_TZ_INFO=y
|
||||
BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNAL_INFIX_PATH}/board/x86_64/rootfs ${BR2_EXTERNAL_INFIX_PATH}/board/netconf/rootfs"
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="board/qemu/x86_64/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/netconf/post-build.sh"
|
||||
BR2_ROOTFS_POST_IMAGE_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-image.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/x86_64/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
BR2_LINUX_KERNEL_NEEDS_HOST_LIBELF=y
|
||||
BR2_PACKAGE_BUSYBOX_CONFIG="${BR2_EXTERNAL_INFIX_PATH}/board/common/busybox_defconfig"
|
||||
BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
|
||||
BR2_PACKAGE_JQ=y
|
||||
BR2_PACKAGE_DBUS_CXX=y
|
||||
BR2_PACKAGE_DBUS_GLIB=y
|
||||
BR2_PACKAGE_DBUS_TRIGGERD=y
|
||||
BR2_PACKAGE_EUDEV_RULES_GEN=y
|
||||
# BR2_PACKAGE_EUDEV_ENABLE_HWDB is not set
|
||||
BR2_PACKAGE_RNG_TOOLS=y
|
||||
BR2_PACKAGE_LIBOPENSSL_BIN=y
|
||||
BR2_PACKAGE_NETOPEER2_CLI=y
|
||||
BR2_PACKAGE_NSS_MDNS=y
|
||||
BR2_PACKAGE_ONIGURUMA=y
|
||||
BR2_PACKAGE_AVAHI=y
|
||||
BR2_PACKAGE_AVAHI_DAEMON=y
|
||||
BR2_PACKAGE_AVAHI_DEFAULT_SERVICES=y
|
||||
BR2_PACKAGE_CHRONY=y
|
||||
BR2_PACKAGE_DNSMASQ=y
|
||||
BR2_PACKAGE_ETHTOOL=y
|
||||
# BR2_PACKAGE_IFUPDOWN_SCRIPTS is not set
|
||||
BR2_PACKAGE_LLDPD=y
|
||||
BR2_PACKAGE_OPENRESOLV=y
|
||||
BR2_PACKAGE_OPENSSH=y
|
||||
BR2_PACKAGE_SSDP_RESPONDER=y
|
||||
BR2_PACKAGE_TCPDUMP=y
|
||||
BR2_PACKAGE_KMOD_TOOLS=y
|
||||
BR2_PACKAGE_SYSKLOGD=y
|
||||
BR2_PACKAGE_SYSKLOGD_LOGGER=y
|
||||
BR2_TARGET_ROOTFS_SQUASHFS=y
|
||||
# BR2_TARGET_ROOTFS_TAR is not set
|
||||
BR2_PACKAGE_CONFD=y
|
||||
BR2_PACKAGE_STATD=y
|
||||
BR2_PACKAGE_FACTORY=y
|
||||
BR2_PACKAGE_FINIT_SULOGIN=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_HOTPLUG=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_HOOK_SCRIPTS=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_MODULES_LOAD=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_MODPROBE=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_RTC=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_TTY=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_URANDOM=y
|
||||
BR2_PACKAGE_KLISH_PLUGIN_INFIX=y
|
||||
BR2_PACKAGE_NET=y
|
||||
# SIGN_ENABLED is not set
|
||||
# GNS3_APPLIANCE is not set
|
||||
@@ -4,6 +4,345 @@ Change Log
|
||||
All notable changes to the project are documented in this file.
|
||||
|
||||
|
||||
[v23.11.0][] - 2023-11-30
|
||||
-------------------------
|
||||
|
||||
> **Note:** this is the first release where the `root` account is disabled in
|
||||
> default builds. Only the `admin` user, generated from `factory-config`, can
|
||||
> log in to the system. This can be changed only in developer builds: `make
|
||||
> menuconfig` -> System configuration -> `[*]Enable root login with password`
|
||||
|
||||
### YANG Status
|
||||
|
||||
- [ieee802-ethernet-interface][]: Currently supported (read-only) features:
|
||||
- Status of auto-negotiation, and if enabled.
|
||||
- Current speed and duplex
|
||||
- Frame counters:
|
||||
|
||||
| **YANG** | **Linux / Ethtool** |
|
||||
|-----------------------------|-----------------------------------|
|
||||
| `out-frames` | `FramesTransmittedOK` |
|
||||
| `out-multicast-frames` | `MulticastFramesXmittedOK` |
|
||||
| `out-broadcast-frames` | `BroadcastFramesXmittedOK` |
|
||||
| `in-total-octets` | `FramesReceivedOK` |
|
||||
| | + `FrameCheckSequenceErrors` |
|
||||
| | + `FramesLostDueToIntMACRcvError` |
|
||||
| | + `AlignmentErrors` |
|
||||
| | + `etherStatsOversizePkts` |
|
||||
| | + `etherStatsJabbers` |
|
||||
| `in-frames` | `FramesReceivedOK` |
|
||||
| `in-multicast-frames` | `MulticastFramesReceivedOK` |
|
||||
| `in-broadcast-frames` | `BroadcastFramesReceivedOK` |
|
||||
| `in-error-undersize-frames` | `undersize_pkts` |
|
||||
| `in-error-fcs-frames` | `FrameCheckSequenceErrors` |
|
||||
|
||||
- [ietf-system][]:
|
||||
- **augments:**
|
||||
- MotD (Message of the Day)
|
||||
- User login shell, default: `/bin/false` (no SSH or console login)
|
||||
- State information for remotely querying firmware version information
|
||||
- **deviations:**
|
||||
- timezone-name, using IANA timezones instead of plain string
|
||||
- UTC offset, only support per-hour offsets with [tzdata][]
|
||||
- Usernames, clarifying Linux restrictions
|
||||
- Unsupported features marked as deviations, e.g. RADIUS
|
||||
- [infix-system-software][]: firmware upgrade with `install-bundle` RPC
|
||||
- [ietf-interfaces][]:
|
||||
- deviation to allow read-write `if:phys-address` for custom MAC address
|
||||
- [ietf-ip][]: augments
|
||||
- IPv4LL similar to standardized IPv6LL
|
||||
- [ietf-ip][]: deviations (`not-supported`) added for IPv4 and IPv6:
|
||||
- `/if:interfaces/if:interface/ip:ipv4/ip:address/ip:subnet/ip:netmask`
|
||||
- `/if:interfaces/if:interface/ip:ipv6/ip:address/ip:status`
|
||||
- `/if:interfaces/if:interface/ip:ipv4/ip:neighbor`
|
||||
- `/if:interfaces/if:interface/ip:ipv6/ip:neighbor`
|
||||
- [ietf-routing][]: Base model for routing
|
||||
- [ietf-ipv4-unicast-routing][]: Static unicast routing, incl. operational
|
||||
data, i.e., setting static IPv4 routes and reading IPv4 routing table
|
||||
- [infix-ethernet-interface][]: deviations for ieee802-ethernet-interface
|
||||
- [infix-routing][]: Limit ietf-routing to one instance `default` per
|
||||
routing protocol, also details unsupported features (deviations)
|
||||
- [infix-if-bridge][]: Linux bridge interfaces with native VLAN support
|
||||
- [infix-if-type][]: deviation for interface types, limiting number
|
||||
to supported types only. New identities are derived from default
|
||||
IANA interface types, ensuring compatibility with other standard
|
||||
models, e.g., `ieee802-ethernet-interface.yang`
|
||||
- [infix-if-veth][]: Linux VETH pairs
|
||||
- [infix-if-vlan][]: Linux VLAN interfaces, e.g. `eth0.10`
|
||||
- **Configurable services:**
|
||||
- [ieee802-dot1ab-lldp][]: stripped down to an `enabled` setting
|
||||
- [infix-services][]: support for enabling mDNS service/device discovery
|
||||
|
||||
[tzdata]: https://www.iana.org/time-zones
|
||||
[ietf-system]: https://www.rfc-editor.org/rfc/rfc7317.html
|
||||
[ietf-interfaces]: https://www.rfc-editor.org/rfc/rfc7223.html
|
||||
[ietf-ip]: https://www.rfc-editor.org/rfc/rfc8344.html
|
||||
[ietf-if-vlan-encapsulation]: https://www.ietf.org/id/draft-ietf-netmod-sub-intf-vlan-model-08.html
|
||||
[ietf-routing]: https://www.rfc-editor.org/rfc/rfc8349
|
||||
[ietf-ipv4-unicast-routing]: https://www.rfc-editor.org/rfc/rfc8349#page-29
|
||||
[ieee802-dot1ab-lldp]: https://github.com/kernelkit/infix/blob/985c2fd/src/confd/yang/ieee802-dot1ab-lldp%402022-03-15.yang
|
||||
[ieee802-ethernet-interface]: https://github.com/kernelkit/infix/blob/985c2fd/src/confd/yang/ieee802-ethernet-interface%402019-06-21.yang
|
||||
[infix-ethernet-interface]: https://github.com/kernelkit/infix/blob/985c2fd/src/confd/yang/infix-ethernet-interface%402023-11-22.yang
|
||||
[infix-if-bridge]: https://github.com/kernelkit/infix/blob/985c2fd/src/confd/yang/infix-if-bridge%402023-11-08.yang
|
||||
[infix-if-type]: https://github.com/kernelkit/infix/blob/985c2fd/src/confd/yang/infix-if-type%402023-08-21.yang
|
||||
[infix-if-veth]: https://github.com/kernelkit/infix/blob/985c2fd/src/confd/yang/infix-if-veth%402023-06-05.yang
|
||||
[infix-if-vlan]: https://github.com/kernelkit/infix/blob/985c2fd/src/confd/yang/infix-if-vlan%402023-10-25.yang
|
||||
[infix-ip]: https://github.com/kernelkit/infix/tree/985c2fd/src/confd/yang/infix-ip%402023-09-14.yang
|
||||
[infix-routing]: https://github.com/kernelkit/infix/blob/985c2fd/src/confd/yang/infix-routing%402023-11-23.yang
|
||||
[infix-services]: https://github.com/kernelkit/infix/blob/985c2fd/src/confd/yang/infix-services%402023-10-16.yang
|
||||
[infix-system-software]: https://github.com/kernelkit/infix/tree/985c2fd/src/confd/yang/infix-system-software%402023-06-27.yang
|
||||
|
||||
### Changes
|
||||
|
||||
- The CLI built-in command `password generate` has been changed to use the
|
||||
secure mode of the `pwgen` tool, and 13 chars for increased entropy
|
||||
- The `qemu.sh -c` command, available in developer builds and the release zip,
|
||||
can now be used to modify the RAM size and enable VPD emulation
|
||||
- Add support for overriding generated factory defaults in derivatives
|
||||
using a `/etc/confdrc.lcocal` file -- incl. updated branding docs.
|
||||
- Add support for detecting factory reset condition from a bootloader
|
||||
- Ensure `/var` is also cleared (properly) during factory reset
|
||||
- Add support for port auto-negotiation status in operational datastore
|
||||
- Add CLI support for showing veth pairs in `show interfaces`
|
||||
- Speedups to CLI detailed view of a single interface
|
||||
- Updated documentation of VLAN interfaces and VLAN filtering bridge
|
||||
- Updated documentation for how to customize services in *Hybrid Mode*
|
||||
- In RMA mode (runlevel 9), the system no longer has any login services
|
||||
- Disable `root` login in all NETCONF builds, only `admin` available
|
||||
- Add support for VPD data in ONIE EEPROM format
|
||||
- Add `iito`, the intelligent input/output daemon for LED control
|
||||
- Add port autoneg and speed/duplex status to operational data
|
||||
- Upgrade Linux to v6.5.11, with kkit extensions
|
||||
- Add support for static IPv4 routing using `ietf-routing@2018-03-13.yang` and
|
||||
`ietf-ipv4-unicast-routing@2018-03-13.yang`, one `default` instance only
|
||||
- Add support for partitioning and self-provisioning of new devices
|
||||
- Add support for reading `admin` user's default password from VPD. Devices
|
||||
that do not have a VPD can set a password hash in the device tree
|
||||
- Add support for upgrading software bundles (images) from the CLI.
|
||||
Supported remote servers: ftp, tftp, and http/https.
|
||||
- Traversing the CLI configure context has been simplified by collapsing all
|
||||
YANG containers that only contain a single list element. Example:
|
||||
`edit interfaces interface eth0` becomes `edit interface eth0`
|
||||
- Add CLI support for creating configuration backups and transferring files
|
||||
to/from remote servers: tftp, ftp, http/https (download only). Issue #155
|
||||
- Add `_netconf-ssh._tcp` record to mDNS-SD
|
||||
|
||||
### Fixes
|
||||
|
||||
- Fix #111: fix auto-inference of dynamic interface types (bridge, veth)
|
||||
- Fix #125: improved feedback on invalid input in configure context
|
||||
- Fix #198: drop bridge default PVID setting, for VLAN filtering bridge.
|
||||
All bridge ports must have explicit VLAN assignment (security)
|
||||
- Fix #215: impossible to enable NTP client, regression from v23.06.0
|
||||
- Fix regression in CLI `show factory-config` command
|
||||
- Fix missing version in `/etc/os-release` variable `PRETTY_NAME`
|
||||
- Fix failure to start `podman` in GNS3 (missing Ext4 filesystem feature)
|
||||
- Fix initial terminal size probing in CLI when logging in from console port
|
||||
- Fix CLI `show running-config`, use proper JSON format like other files
|
||||
- Fix caching of libyang module references in confd. Loading other plugins to
|
||||
sysrepo-plugind modifies these references, which may can cause corruption
|
||||
- Fix missing `v` in `VERSION`, `VERSION_ID`, and `IMAGE_VERSION` in
|
||||
`/etc/os-release` and other generated files for release builds.
|
||||
|
||||
|
||||
[v23.10.0][] - 2023-10-31
|
||||
-------------------------
|
||||
|
||||
> **Note:** upcoming releases will lock the `root` user for system-only
|
||||
> services. Instead an `admin` user will be the only default user with
|
||||
> the CLI as its login shell. This user is already available, so please
|
||||
> consider updating any guidelines or documentation you may have.
|
||||
|
||||
### YANG Status
|
||||
|
||||
- [ietf-system][]:
|
||||
- **augments:**
|
||||
- MotD (Message of the Day)
|
||||
- User login shell, default: `/bin/false`
|
||||
- State information for remotely querying firmware version information
|
||||
- **deviations:**
|
||||
- timezone-name, using IANA timezones instead of plain string
|
||||
- UTC offset, only support per-hour offsets with [tzdata][]
|
||||
- Usernames, clarifying Linux restrictions
|
||||
- Unsupported features marked as deviations, e.g. RADIUS
|
||||
- [infix-system-software][]: firmware upgrade with `install-bundle` RPC
|
||||
- [ietf-interfaces][]:
|
||||
- deviation to allow read-write `if:phys-address` for custom MAC address
|
||||
- [ietf-ip][]: augments
|
||||
- IPv4LL similar to standardized IPv6LL
|
||||
- [ietf-ip][]: deviations (`not-supported`) added for IPv4 and IPv6:
|
||||
- `/if:interfaces/if:interface/ip:ipv4/ip:address/ip:subnet/ip:netmask`
|
||||
- `/if:interfaces/if:interface/ip:ipv6/ip:address/ip:status`
|
||||
- `/if:interfaces/if:interface/ip:ipv4/ip:neighbor`
|
||||
- `/if:interfaces/if:interface/ip:ipv6/ip:neighbor`
|
||||
- ~~[ietf-if-vlan-encapsulation][]:~~ Removed in favor of a native model.
|
||||
- [infix-if-bridge][]: Linux bridge interfaces with native VLAN support
|
||||
- [infix-if-type][]: deviation for interface types, limiting number
|
||||
to supported types only. New identities are derived from default
|
||||
IANA interface types, ensuring compatibility with other standard
|
||||
models, e.g., `ieee802-ethernet-interface.yang`
|
||||
- [infix-if-veth][]: Linux VETH pairs
|
||||
- [infix-if-vlan][]: Linux VLAN interfaces, e.g. `eth0.10` (New model!)
|
||||
- **Configurable services:**
|
||||
- [ieee802-dot1ab-lldp][]: stripped down to an `enabled` setting
|
||||
- [infix-services][]: support for enabling mDNS service/device discovery
|
||||
|
||||
[tzdata]: https://www.iana.org/time-zones
|
||||
[ieee802-dot1ab-lldp]: https://github.com/kernelkit/infix/tree/50a550b/src/confd/yang/ieee802-dot1ab-lldp%402022-03-15.yang
|
||||
[ietf-system]: https://www.rfc-editor.org/rfc/rfc7317.html
|
||||
[ietf-interfaces]: https://www.rfc-editor.org/rfc/rfc7223.html
|
||||
[ietf-ip]: https://www.rfc-editor.org/rfc/rfc8344.html
|
||||
[ietf-if-vlan-encapsulation]: https://www.ietf.org/id/draft-ietf-netmod-sub-intf-vlan-model-08.html
|
||||
[infix-if-bridge]: https://github.com/kernelkit/infix/blob/fc5310b/src/confd/yang/infix-if-bridge%402023-08-21.yang
|
||||
[infix-if-type]: https://github.com/kernelkit/infix/tree/fc5310b/src/confd/yang/infix-if-type%402023-08-21.yang
|
||||
[infix-if-veth]: https://github.com/kernelkit/infix/tree/fc5310b/src/confd/yang/infix-if-veth%402023-06-05.yang
|
||||
[infix-if-vlan]: https://github.com/kernelkit/infix/blob/fc5310b/src/confd/yang/infix-if-vlan%402023-10-25.yang
|
||||
|
||||
[infix-ip]: https://github.com/kernelkit/infix/tree/fc5310b/src/confd/yang/infix-ip%402023-09-14.yang
|
||||
[infix-services]: https://github.com/kernelkit/infix/blob/fc5310b/src/confd/yang/infix-services%402023-10-16.yang
|
||||
[infix-system-software]: https://github.com/kernelkit/infix/tree/fc5310b/src/confd/yang/infix-system-software%402023-06-27.yang
|
||||
|
||||
### Changes
|
||||
|
||||
- Add support for setting/querying IPv4/IPv6 MTU, see #152 for details.
|
||||
- Add support for *Fail Secure Mode*: if loading `startup-config` fails,
|
||||
e.g. YANG model validation failure after upgrade, the system now falls back
|
||||
to load `failure-config` instead of just crashing. This config, along with
|
||||
`factory-config`, is generated on every boot to match the active image's
|
||||
YANG models. In case neither config can be loaded, or even bootstrapping
|
||||
YANG models fail, the system will go into an RMA state -- Return to
|
||||
Manufacturer, clearly signaled on the console and, on devices that support
|
||||
it, angry LED signaling. See #154 for more.
|
||||
- Add support for generating GNS3 appliance file for NETCONF Aarch64.
|
||||
- Add support for UTC offset (+/- HH:00) in `ietf-system`, PR #174
|
||||
- Add support for `ietf-factory-default` RPC, PR #175
|
||||
- Add support for performing factory reset (using #175 RPC) from CLI
|
||||
- Replace `ietf-if-vlan-encapsulation` YANG model with the native
|
||||
`infix-if-vlan` model. This fits better with Linux VLAN interfaces and
|
||||
simplifies the syntax greatly. For details, see PR #179
|
||||
|
||||
admin@example:/config/interfaces/interface/eth0.10/> set vlan id 10 lower-layer-if eth0
|
||||
|
||||
- The following new NETCONF interface operational counters have been added:
|
||||
|
||||
| **YANG** | **Linux / Ethtool** |
|
||||
|-----------------------------|-----------------------------------|
|
||||
| `out-frames` | `FramesTransmittedOK` |
|
||||
| `out-multicast-frames` | `MulticastFramesXmittedOK` |
|
||||
| `out-broadcast-frames` | `BroadcastFramesXmittedOK` |
|
||||
| `in-total-frames` | `FramesReceivedOK` |
|
||||
| | + `FrameCheckSequenceErrors` |
|
||||
| | + `FramesLostDueToIntMACRcvError` |
|
||||
| | + `AlignmentErrors` |
|
||||
| | + `etherStatsOversizePkts` |
|
||||
| | + `etherStatsJabbers` |
|
||||
| `in-frames` | `FramesReceivedOK` |
|
||||
| `in-multicast-frames` | `MulticastFramesReceivedOK` |
|
||||
| `in-broadcast-frames` | `BroadcastFramesReceivedOK` |
|
||||
| `in-error-undersize-frames` | `undersize_pkts` |
|
||||
| `in-error-fcs-frames` | `FrameCheckSequenceErrors` |
|
||||
|
||||
- Greatly improved branding support using `make menuconfig`. All the
|
||||
identifying strings, including firmware image, is in `/etc/os-release`, will
|
||||
be used in CLI `show system-information`, the WebUI About dialog, and any
|
||||
prominent areas when booting up (on console), logging in to CLI and WebUI.
|
||||
- IGMP/MLD snooping is now disabled by default on new bridges. Support
|
||||
for multicast filtering bridges expected no later than v24.01.
|
||||
- The SSDP responder, device discovery in Windows, has been removed in favor
|
||||
of Windows 10 (build 1709) native support for mDNS-SD. Details in #166
|
||||
- A GreenPAK programmer has been added, not enabled by default. This is a
|
||||
popular programmable little chip from Renesas. Worth a look!
|
||||
- The `confd` script `gen-interfaces` can now generate bridges and stand-alone
|
||||
interfaces with IPv6 (SLAAC) for `factory-config` et al.
|
||||
- Drop `x86_64_minimal_defconfig`, previously used for regression tests only
|
||||
- Documentation updates of how IPv4/IPv6 addresses are shown in NETCONF
|
||||
operational data, as well as the built-in CLI, see #163 for details.
|
||||
|
||||
### Fixes
|
||||
|
||||
- Fix #106: confd: drop deviation `ietf-system:timezone-utc-offset`
|
||||
- Fix #151: Operational status broken in v23.09
|
||||
- Fix #159: Hacky generation of `/etc/resolv.conf` at boot
|
||||
- Fix #162: VLAN interface without encapsulation is accepted by YANG model
|
||||
|
||||
|
||||
[v23.09.0][] - 2023-10-02
|
||||
-------------------------
|
||||
|
||||
> **Note:** upcoming releases will lock the `root` user for system-only
|
||||
> services. Instead an `admin` user will be the only default user with
|
||||
> the CLI as its login shell. This user is already available, so please
|
||||
> consider updating any guidelines or documentation you may have.
|
||||
|
||||
### YANG Status
|
||||
|
||||
- [ietf-system][]:
|
||||
- [infix-system][]: MotD (Message of the Day) augment
|
||||
- [infix-system][]: user login shell augment, default: `/bin/false`
|
||||
- [infix-system-software][]: system-state/software augment for
|
||||
remotely querying firmware version information
|
||||
- [infix-system-software][]: firmware upgrade with `install-bundle` RPC
|
||||
- [infix-system][]: timezone-name deviation, replaced with IANA timezones
|
||||
- [infix-system][]: username deviation, clarifying Linux restrictions
|
||||
- [infix-system][]: deviations for unsupported features, e.g. RADIUS
|
||||
- [ietf-interfaces][]:
|
||||
- [infix-interfaces][]: deviation for `if:phys-address` to allow read-write
|
||||
- [ietf-ip][]: augmented with IPv4LL similar to standardized IPv6LL
|
||||
- [infix-ip][]: deviations (`not-supported`) added for IPv4 and IPv6:
|
||||
- `/if:interfaces/if:interface/ip:ipv4/ip:address/ip:subnet/ip:netmask`
|
||||
- `/if:interfaces/if:interface/ip:ipv6/ip:address/ip:status`
|
||||
- `/if:interfaces/if:interface/ip:ipv4/ip:mtu`
|
||||
- `/if:interfaces/if:interface/ip:ipv6/ip:mtu`
|
||||
- `/if:interfaces/if:interface/ip:ipv4/ip:neighbor`
|
||||
- `/if:interfaces/if:interface/ip:ipv6/ip:neighbor`
|
||||
- [ietf-if-vlan-encapsulation][]: Linux VLAN interfaces, e.g. `eth0.10`
|
||||
- [infix-if-bridge][]: Linux bridge interfaces with native VLAN support
|
||||
- [infix-if-veth][]: Linux VETH pairs
|
||||
- [infix-if-type][]: deviation for interface types, limiting number
|
||||
to supported types only. New identities are derived from default
|
||||
IANA interface types, ensuring compatibility with other standard
|
||||
models, e.g., `ieee802-ethernet-interface.yang`
|
||||
- Configurable services:
|
||||
- [ieee802-dot1ab-lldp][]: stripped down to an `enabled` setting
|
||||
- [infix-services][]: support for enabling mDNS and SSDP discovery
|
||||
|
||||
[br2023.02.2]: https://git.busybox.net/buildroot/tag/?h=2023.02.2
|
||||
[ieee802-dot1ab-lldp]: https://github.com/kernelkit/infix/tree/50a550b/src/confd/yang/ieee802-dot1ab-lldp%402022-03-15.yang
|
||||
[ietf-system]: https://www.rfc-editor.org/rfc/rfc7317.html
|
||||
[ietf-interfaces]: https://www.rfc-editor.org/rfc/rfc7223.html
|
||||
[ietf-ip]: https://www.rfc-editor.org/rfc/rfc8344.html
|
||||
[ietf-if-vlan-encapsulation]: https://www.ietf.org/id/draft-ietf-netmod-sub-intf-vlan-model-08.html
|
||||
[infix-if-bridge]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-if-bridge%402023-08-21.yang
|
||||
[infix-if-type]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-if-type%402023-08-21.yang
|
||||
[infix-if-veth]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-if-veth%402023-06-05.yang
|
||||
[infix-interfaces]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-interfaces%402023-09-19.yang
|
||||
[infix-ip]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-ip%402023-09-14.yang
|
||||
[infix-services]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-services%402023-08-22.yang
|
||||
[infix-system]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-system%402023-08-15.yang
|
||||
[infix-system-software]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-system-software%402023-06-27.yang
|
||||
|
||||
### Changes
|
||||
|
||||
- The following new NETCONF interface operational status have been added:
|
||||
- admin-status
|
||||
- IP address origin (dhcp, static, link-layer, random, other)
|
||||
- bridge
|
||||
- parent-interface
|
||||
- basic statistics (`in_octets`, `out_octets`)
|
||||
- Support for custom interface `phys-address` (MAC address)
|
||||
- The CLI admin-exec command `show interfaces` now fully uses NETCONF
|
||||
operational data to display both available interfaces and all of their
|
||||
IP addresses. Displaying an individual interface will show more info.
|
||||
- The CLI admin-exec command `password encrypt` now default to SHA512
|
||||
|
||||
### Fixes
|
||||
|
||||
- Fix #136: IPv6 autoconf `create-global-addresses true` does not bite
|
||||
- Fix #138: Not possible to have static IP and DHCP at the same time
|
||||
- Minor fixes and updates to documentation (faulty links, references)
|
||||
- The `sync-fork.yml` workflow has finally been fixed.
|
||||
|
||||
|
||||
[v23.08.0][] - 2023-08-31
|
||||
-------------------------
|
||||
|
||||
@@ -139,7 +478,9 @@ Supported YANG models in addition to those used by sysrepo and netopeer:
|
||||
- N/A
|
||||
|
||||
[buildroot]: https://buildroot.org/
|
||||
[UNRELEASED]: https://github.com/kernelkit/infix/compare/v23.08.0...HEAD
|
||||
[UNRELEASED]: https://github.com/kernelkit/infix/compare/v23.10.0...HEAD
|
||||
[v23.10.0]: https://github.com/kernelkit/infix/compare/v23.09.0...v23.10.0
|
||||
[v23.09.0]: https://github.com/kernelkit/infix/compare/v23.08.0...v23.09.0
|
||||
[v23.08.0]: https://github.com/kernelkit/infix/compare/v23.06.0...v23.08.0
|
||||
[v23.06.0]: https://github.com/kernelkit/infix/compare/BASE...v23.06.0
|
||||
[sysrepo]: https://www.sysrepo.org/
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
variant.md
|
||||
@@ -1,7 +1,7 @@
|
||||
* TODO doc: User Guide
|
||||
|
||||
- Feature set and scope, e.g.
|
||||
- Device discovery: SSDP, LLDP, mDNS-SD how do they work, interfacing with Windows/macOS/Linux
|
||||
- Device discovery: LLDP, mDNS-SD how do they work, interfacing with Windows/macOS/Linux
|
||||
- Network redundancy protocols: STP/RSTP, MRP
|
||||
- Configuring the system; using ifupdown2, enabling/disabling services
|
||||
- Diagnosing the system; using rmon, port mirroring, debugging services, searching logs
|
||||
|
||||
@@ -62,7 +62,7 @@ To mitigate the risk of a malicious user being able to circumvent the
|
||||
bootloader's validation procedure, user configuration is kept to a
|
||||
minimum. Two settings are available:
|
||||
|
||||
- **Boot order**: Since Infix maintains two copies of its firmware,
|
||||
- **Boot order**: Since Infix maintains two copies of its software image,
|
||||
and as some bootloaders support netbooting, the order in which boot
|
||||
sources are considered can be configured. To select the active
|
||||
source, use [RAUC][]:
|
||||
@@ -106,7 +106,7 @@ boot Infix over the network. DHCP is used to configure the network
|
||||
and TFTP to transfer the image to the system's RAM.
|
||||
|
||||
Access to U-Boot's shell is disabled to prevent side-loading of
|
||||
malicious firmware. To configure the active boot partition, refer to
|
||||
malicious software. To configure the active boot partition, refer to
|
||||
the [Bootloader Interface](#bootloader-interface) section.
|
||||
|
||||
|
||||
@@ -128,11 +128,11 @@ Interface](#bootloader-interface).
|
||||
System Upgrade
|
||||
==============
|
||||
|
||||
Much of the minutiae of firmware upgrades is delegated to [RAUC][],
|
||||
Much of the minutiae of software upgrades is delegated to [RAUC][],
|
||||
which offers lots of benefits out-of-the-box:
|
||||
|
||||
- Upgrade Bundles are always signed, such that their authenticity can
|
||||
be verified by the running firmware, before the new one is
|
||||
be verified by the running operating system, before the new one is
|
||||
installed.
|
||||
|
||||
- The bureaucracy of interfacing with different bootloaders, manage
|
||||
|
||||
@@ -0,0 +1,205 @@
|
||||
Branding & Releases
|
||||
===================
|
||||
|
||||
This document is for projects using Infix as a br2-external, i.e., OEMs.
|
||||
|
||||
|
||||
Branding
|
||||
--------
|
||||
|
||||
Branding is done in menuconfig, there are several settings affecting
|
||||
it, most are in the Infix external subsection called "Branding", but
|
||||
there is also `BR2_TARGET_GENERIC_HOSTNAME`, which deserves a
|
||||
special mention.
|
||||
|
||||
The hostname is used for the system default `/etc/hostname`, which
|
||||
is the base name for the "unique:ified" hostname + the last three
|
||||
octets of the base MAC[^1] address, e.g., `infix-c0-ff-ee`. This in
|
||||
turn is the hostname that is set at first boot and also advertised
|
||||
by device discovery protocols like mDNS-SD and LLDP.
|
||||
|
||||
See the help texts for the *Infix Branding* settings to understand
|
||||
which ones are mandatory and which are optional, menuconfig does not
|
||||
check this for you and you may end up with odd results.
|
||||
|
||||
Verify the result after a build by inspecting:
|
||||
|
||||
- `output/images/*`: names, missing prefix, etc.
|
||||
- `output/target/etc/os-release`: this file is sourced by
|
||||
other build scripts, e.g., `mkgns3a.sh`. For reference, see
|
||||
https://www.freedesktop.org/software/systemd/man/os-release.html
|
||||
|
||||
> **Note:** to get proper GIT revision (hash) from your composed OS,
|
||||
> remember in menuconfig to set `INFIX_OEM_PATH`. When unset the
|
||||
> Infix `post-build.sh` script defaults to the Infix base path. The
|
||||
> revision is stored in the file `/etc/os-release` as BUILD_ID and
|
||||
> is also in the file `/etc/version`. See below for more info.
|
||||
|
||||
[^1]: The base MAC address is defined in the device's Vital Product
|
||||
Data (VPD) EEPROM, or similar, which is used by the kernel to
|
||||
create the system interfaces. This MAC address is usually also
|
||||
printed on a label on the device.
|
||||
|
||||
|
||||
Factory Defaults
|
||||
----------------
|
||||
|
||||
The Infix default configuration, factory-config, is part static files
|
||||
and part per-device generated files, e.g., SSH hostkey and hostname.
|
||||
The latter is constructed from the file `/etc/hostname`, appended with
|
||||
the last three octets of the system's base MAC address. To override the
|
||||
base hostname, set `BR2_TARGET_GENERIC_HOSTNAME` in your defconfig.
|
||||
|
||||
The static files are installed by Infix `confd` in `/usr/share/confd/`
|
||||
at build time. It contains two subdirectories:
|
||||
|
||||
/usr/share/confd/
|
||||
|- factory.d/
|
||||
| |- 10-foo.json
|
||||
| |- 10-bar.json
|
||||
| `- 10-qux.json
|
||||
`- failure.d/
|
||||
|- 10-xyzzy.json
|
||||
`- 10-garply.json
|
||||
|
||||
To override, or extend, these files in you br2-external, set up a rootfs
|
||||
overlay and add it last in `BR2_ROOTFS_OVERLAY`. Your overlay can look
|
||||
something like this:
|
||||
|
||||
./board/common/rootfs/
|
||||
|- etc/
|
||||
| |- confdrc # See below
|
||||
| `- confdrc.local
|
||||
`- usr/
|
||||
`- share/
|
||||
`- confd/
|
||||
|- 10-foo.json # Override Infix foo
|
||||
|- 30-bar.json # Extend, probably 10-bar.json
|
||||
`- 30-fred.json # Extend, your own defaults
|
||||
|
||||
Using the same filename in your overlay, here `10-foo.json`, completely
|
||||
replaces the contents of the same file provided by Infix. If you just
|
||||
want to extend, or replace parts of an Infix default, use `30-....json`.
|
||||
Here the file `30-bar.json` is just a helpful hit to maintainers of your
|
||||
br2-external that it probably extends Infix' `10-bar.json`.
|
||||
|
||||
The reason for the jump in numbers is that 20 is reserved for files
|
||||
generated by Infix' `gen-function` scripts. Your br2-external can
|
||||
provide a few custom ones that the `bootstrap` knows about, e.g.,
|
||||
`gen-ifs-custom` that overrides `20-interfaces.json`. See the
|
||||
bootstrap script for more help, and up-to-date information.
|
||||
|
||||
> **Note:** you may not need to provide your own `/etc/confdrc`. The
|
||||
> one installed by `confd` is usually enough. However, if you want to
|
||||
> adjust the behavior of `bootstrap` you may want to override it. There
|
||||
> is also `confdrc.local`, which usually is enough to change arguments
|
||||
> to scripts like `gen-interfaces`, e.g., to create a bridge by default,
|
||||
> you may want to look into `GEN_IFACE_OPTS`.
|
||||
|
||||
|
||||
Integration
|
||||
-----------
|
||||
|
||||
When integrating your software stack with Infix there may be protocols
|
||||
that want to change system settings like hostname and dynamically set
|
||||
IP address and default gateway, e.g. PROFINET. This section detail a
|
||||
few recommendations for maintaining co-existence in this scenario of
|
||||
the multiple producers problem.
|
||||
|
||||
First, there's a clear difference between "singleton" like hostsname
|
||||
and an interface IP address. Consider the case of a static IP and a
|
||||
DHCP assigned IP, these can co-exist because of the `proto NUM` field
|
||||
available in iproute2. This is used in Infix so that static addresses
|
||||
can be flushed independently of DHCP addresses. The same can be done
|
||||
by other "address providers", e.g., PROFINET.
|
||||
|
||||
Changing properties like hostname should be done by injecting a change
|
||||
into Infix, by for example calling `sysrepocfg -Ediff.xml`. Here is an
|
||||
example of how to get the current hostname and apply an XML diff:
|
||||
|
||||
```
|
||||
root@infix-00-00-00:~# sysrepocfg -X -x "/system/hostname" > hostnm.xml
|
||||
root@infix-00-00-00:~# cat hostnm.xml
|
||||
<system xmlns="urn:ietf:params:xml:ns:yang:ietf-system">
|
||||
<hostname>infix-00-00-00</hostname>
|
||||
</system>
|
||||
root@infix-00-00-00:~# edit hostnm.xml
|
||||
root@infix-00-00-00:~# sysrepocfg -Ehostnm.xml
|
||||
root@example:~#
|
||||
```
|
||||
|
||||
Second, perform all changes on `running-config`, the running datastore.
|
||||
That way you have a clear state to return to if your application needs
|
||||
to do a factory reset. E.g., in PROFINET a type 1/2 factory reset will
|
||||
reset only the PROFINET specific settings. That way you can actually
|
||||
have your system `startup-config` disable all physical ports and the
|
||||
PROFINET application enables only ports that are not deactivated. (On
|
||||
factory reset it will not know of any ports to deactivate so it will
|
||||
activate all.)
|
||||
|
||||
You can consider the system composed of two entities:
|
||||
|
||||
- NETCONF starts up the system using `startup-config`, then
|
||||
- Hands over control to your application at runtime
|
||||
|
||||
Infix is prepared for this by already having two "runlevels" for these
|
||||
two states. The `startup-config` is applied in runlevel S (bootstrap)
|
||||
and the system then enters runlevel 2 for normal operation.
|
||||
|
||||
This allow you to keep a set of functionality that is provided by the
|
||||
underlying system, and another managed by your application. You can
|
||||
of course in your br2-external provide a sysrepo plugin that block
|
||||
operations on certain datastores when your application is enabled.
|
||||
E.g., to prevent changes to startup after initial deployment. In
|
||||
that case a proper factory reset would be needed to get back to a
|
||||
"pre-deployment" state where you can reconfigure your baseline.
|
||||
|
||||
|
||||
Releases
|
||||
--------
|
||||
|
||||
A release build requires the global variable `INFIX_RELEASE` to be set.
|
||||
It can be derived from GIT, if the source tree is kept in GIT VCS. First,
|
||||
let us talk about versioning in general.
|
||||
|
||||
### Versioning
|
||||
|
||||
Two popular scheme for versioning a product derived from Infix:
|
||||
|
||||
1. Track Infix major.minor, e.g. *Foobar v23.08.z*, where `z` is
|
||||
your patch level. I.e., Foobar v23.08.0 could be based on Infix
|
||||
v23.08.0, or v23.08.12, it is up to you. Maybe you based it on
|
||||
v23.08.12 and then back ported changes from v23.10.0, but it was
|
||||
the first release you made to your customer(s).
|
||||
2. Start from v1.0.0 and step the major number every time you sync
|
||||
with a new Infix release, or every time Infix bumps to the next
|
||||
Buildroot LTS.
|
||||
|
||||
The important thing is to be consistent, not only for your own sake,
|
||||
but also for your end customers. The *major.minor.patch* style is
|
||||
the most common and often recommended style, which usually maps well
|
||||
to other systems, e.g. PROFINET GSDML files require this (*VX.Y.Z*).
|
||||
But you can of course use only two numbers, *major.minor*, as well.
|
||||
|
||||
> What could be confusing, however, is if you use the name *Infix*
|
||||
> with your own versioning scheme.
|
||||
|
||||
|
||||
### `INFIX_RELEASE`
|
||||
|
||||
This global variable **must be** a lower-case string (no spaces or
|
||||
other characters outside of 0–9, a–z, '.', '_' and '-') identifying
|
||||
the operating system version, excluding any OS name information or
|
||||
release code name, and suitable for processing by scripts or usage
|
||||
in generated filenames.
|
||||
|
||||
Used for `VERSION` and `VERSION_ID` in `/etc/os-release` and
|
||||
generated file names like disk images, etc.
|
||||
|
||||
**Default:** generated using `git describe --always --dirty --tags`,
|
||||
with an additional `-C $infix_path`. This variable defaults to the
|
||||
Infix tree and can be changed by setting the menuconfig branding
|
||||
variable `INFIX_OEM_PATH` to that of the br2-external. It is also
|
||||
possible to set the `GIT_VERSION` variable in your `post-build.sh`
|
||||
script to change how the VCS version is extracted.
|
||||
|
||||
@@ -35,7 +35,7 @@ The system has several datastores (or files):
|
||||
To save configuration changes made to the `running-config` so the system
|
||||
will use them consecutive reboots, use the `copy` command:
|
||||
|
||||
admin@infix-12-34-56:/> copy running-config startup-config
|
||||
admin@host-12-34-56:/> copy running-config startup-config
|
||||
|
||||
In *configure context* the following commands are available:
|
||||
|
||||
@@ -64,17 +64,17 @@ We inspect the system status to ensure the change took effect. Then we
|
||||
save the changes for the next reboot.
|
||||
|
||||
```
|
||||
admin@infix-12-34-56:/> configure
|
||||
admin@infix-12-34-56:/config/> edit interfaces interface eth0
|
||||
admin@infix-12-34-56:/config/interfaces/interface/eth0/> set ipv4 <TAB>
|
||||
admin@host-12-34-56:/> configure
|
||||
admin@host-12-34-56:/config/> edit interface eth0
|
||||
admin@host-12-34-56:/config/interface/eth0/> set ipv4 <TAB>
|
||||
address autoconf bind-ni-name enabled
|
||||
forwarding mtu neighbor
|
||||
admin@infix-12-34-56:/config/interfaces/interface/eth0/> set ipv4 address 192.168.2.200 prefix-length 24
|
||||
admin@infix-12-34-56:/config/interfaces/interface/eth0/> show
|
||||
admin@host-12-34-56:/config/interface/eth0/> set ipv4 address 192.168.2.200 prefix-length 24
|
||||
admin@host-12-34-56:/config/interface/eth0/> show
|
||||
type ethernetCsmacd;
|
||||
ipv4 address 192.168.2.200 prefix-length 24;
|
||||
ipv6 enabled true;
|
||||
admin@infix-12-34-56:/config/interfaces/interface/eth0/> diff
|
||||
admin@host-12-34-56:/config/interface/eth0/> diff
|
||||
interfaces {
|
||||
interface eth0 {
|
||||
+ ipv4 {
|
||||
@@ -84,14 +84,14 @@ interfaces {
|
||||
+ }
|
||||
}
|
||||
}
|
||||
admin@infix-12-34-56:/config/interfaces/interface/eth0/> leave
|
||||
admin@infix-12-34-56:/> show interfaces brief
|
||||
admin@host-12-34-56:/config/interface/eth0/> leave
|
||||
admin@host-12-34-56:/> show interfaces brief
|
||||
lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
|
||||
eth0 UP 52:54:00:12:34:56 <BROADCAST,MULTICAST,UP,LOWER_UP>
|
||||
admin@infix-12-34-56:exec> show ip brief
|
||||
admin@host-12-34-56:/> show ip brief
|
||||
lo UNKNOWN 127.0.0.1/8 ::1/128
|
||||
eth0 UP 192.168.2.200/24 fe80::5054:ff:fe12:3456/64
|
||||
admin@infix-12-34-56:/> copy running-config startup-config
|
||||
admin@host-12-34-56:/> copy running-config startup-config
|
||||
```
|
||||
|
||||
One of the ideas behind a separate running and startup configuration is
|
||||
@@ -99,7 +99,7 @@ to be able to verify a configuration change. In case of an inadvertent
|
||||
change that, e.g., breaks networking, it is trivial to revert back by:
|
||||
|
||||
```
|
||||
admin@infix-12-34-56:/> copy startup-config running-config
|
||||
admin@host-12-34-56:/> copy startup-config running-config
|
||||
```
|
||||
|
||||
Or restarting the device.
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
User Guide
|
||||
==========
|
||||
|
||||
The command line interface (CLI, see-el-i) is built on the open source
|
||||
component [klish][1], which implements a CISCO like, or Juniper Networks
|
||||
JunOS-like CLI on a UNIX system.
|
||||
The command line interface (CLI, see-ell-aye) is built on the open source
|
||||
component [klish][1], which implements a CISCO-like, or Juniper Networks
|
||||
JunOS-like, CLI for UNIX systems.
|
||||
|
||||
New users always get the CLI as the default "shell" when logging in, but
|
||||
the default `admin` user logs in to the Bash. To access the CLI, type:
|
||||
@@ -18,11 +18,11 @@ Key commands available in any context are:
|
||||
For each command it also possible to press the `?` key and `TAB` to get
|
||||
more help and suggestions for completion.
|
||||
|
||||
> **Note:** for the sake of brevity, the hostname in the following
|
||||
> examples has been shortened to `host`. The default name is composed
|
||||
> from a product specific string followed by the last three octets of
|
||||
> the system base MAC address, e.g., `infix-12-34-56`. An example of
|
||||
> how to change the hostname is included below.
|
||||
> **Note:** for the sake of brevity, the hostname in the following examples
|
||||
> has been shortened to `host`. The default name is composed from a product
|
||||
> specific string followed by the last three octets of the system base MAC
|
||||
> address, e.g., `switch-12-34-56`. An example of how to change the hostname
|
||||
> is included below.
|
||||
|
||||
|
||||
Admin Exec
|
||||
@@ -36,14 +36,74 @@ Available commands can be seen by pressing `?` at the prompt:
|
||||
|
||||
```
|
||||
admin@host:/>
|
||||
configure Create new candidate-config based on running-config
|
||||
copy Copy
|
||||
exit Exit
|
||||
logout Alias for exit
|
||||
shell Enter system shell
|
||||
show Show
|
||||
configure Create new candidate-config based on running-config
|
||||
copy Copy configuration, e.g., copy running-config startup-config
|
||||
exit Exit from CLI (log out)
|
||||
factory-reset Restore the system to factory default state
|
||||
follow Monitor a log file, use Ctrl-C to abort
|
||||
help Help system (also try '?' key)
|
||||
logout Alias to exit
|
||||
netcalc IP subnet calculator
|
||||
password Password tools
|
||||
ping Ping a network host or multicast group
|
||||
poweroff Poweroff system (system policy may yield reboot)
|
||||
reboot Reboot system
|
||||
set Set operations, e.g., current date/time
|
||||
shell Enter system shell
|
||||
show Show system status and configuration files
|
||||
tcpdump Capture network traffic
|
||||
upgrade Install a software update bundle
|
||||
```
|
||||
|
||||
To get more help for a given command, type the command, a space, and
|
||||
then tap `?` again. You can also tap the `Tab` key to see available
|
||||
argument completions.
|
||||
|
||||
### Upgrading the Software
|
||||
|
||||
The admin-exec command `upgrade` can be used to install software images, or
|
||||
bundles. A bundle is a signed and self-contained package that carries all the
|
||||
information necessary to determine if it holds a bootloader, a Linux image, or
|
||||
even both.
|
||||
|
||||
To install a new software image to the currently *inactive* partition[^1], we
|
||||
use the `upgrade` command and a URI to a ftp/tftp/sftp or http/https server
|
||||
that hosts the file:
|
||||
|
||||
```
|
||||
admin@host:/> upgrade tftp://192.168.122.1/firmware-x86_64-v23.11.pkg
|
||||
installing
|
||||
0% Installing
|
||||
0% Determining slot states
|
||||
20% Determining slot states done.
|
||||
20% Checking bundle
|
||||
20% Verifying signature
|
||||
40% Verifying signature done.
|
||||
40% Checking bundle done.
|
||||
40% Checking manifest contents
|
||||
60% Checking manifest contents done.
|
||||
60% Determining target install group
|
||||
80% Determining target install group done.
|
||||
80% Updating slots
|
||||
80% Checking slot rootfs.1
|
||||
90% Checking slot rootfs.1 done.
|
||||
90% Copying image to rootfs.1
|
||||
99% Copying image to rootfs.1 done.
|
||||
99% Updating slots done.
|
||||
100% Installing done.
|
||||
Installing `tftp://192.168.122.1/firmware-x86_64-v23.11.pkg` succeeded
|
||||
admin@host:/>
|
||||
```
|
||||
|
||||
The secondary partition (`rootfs.1`) has now been upgraded and will be used as
|
||||
the *active* partition on the next boot. Leaving the primary partition, with
|
||||
the version we are currently running, intact in case of trouble.
|
||||
|
||||
[^1]: It is not possible to upgrade the partition we booted from. Thankfully
|
||||
the underlying "rauc" subsystem keeps track of this. Hence, to upgrade
|
||||
both partitions you must reboot to the new version (to verify it works)
|
||||
and then repeat the same command.
|
||||
|
||||
Configure Context
|
||||
-----------------
|
||||
|
||||
@@ -51,7 +111,7 @@ Enter the configure context from admin-exec by typing `configure`
|
||||
followed by Enter. Available commands, press `?` at the prompt:
|
||||
|
||||
```
|
||||
admin@host:/>
|
||||
admin@host:/> configure
|
||||
admin@host:/config/>
|
||||
abort Abandon candidate
|
||||
check Validate candidate
|
||||
@@ -73,15 +133,15 @@ admin@host:/config/>
|
||||
The `edit` command lets you change to a sub-configure context, e.g.:
|
||||
|
||||
```
|
||||
admin@host:/config/> edit interfaces interface eth0
|
||||
admin@host:/config/interfaces/interface/eth0/>
|
||||
admin@host:/config/> edit interface eth0
|
||||
admin@host:/config/interface/eth0/>
|
||||
```
|
||||
|
||||
Use `up` to go up one level.
|
||||
|
||||
```
|
||||
admin@host:/config/interfaces/interface/eth0/> up
|
||||
admin@host:/config/interfaces/>
|
||||
admin@host:/config/interface/eth0/> up
|
||||
admin@host:/config/>
|
||||
```
|
||||
|
||||
> **Note:** the tree structure in the configure context is automatically
|
||||
@@ -94,16 +154,16 @@ admin@host:/config/interfaces/>
|
||||
### Set IP Address on an Interface
|
||||
|
||||
```
|
||||
admin@host:/config/> edit interfaces interface eth0
|
||||
admin@host:/config/interfaces/interface/eth0/>
|
||||
admin@host:/config/interfaces/interface/eth0/> set ipv4 address 192.168.2.200 prefix-length 24
|
||||
admin@host:/config/> edit interface eth0
|
||||
admin@host:/config/interface/eth0/>
|
||||
admin@host:/config/interface/eth0/> set ipv4 address 192.168.2.200 prefix-length 24
|
||||
```
|
||||
|
||||
From anywhere in configure context you can see the changes you have
|
||||
made by typing `diff`:
|
||||
|
||||
```
|
||||
admin@host:/config/interfaces/interface/eth0/> diff
|
||||
admin@host:/config/interface/eth0/> diff
|
||||
interfaces {
|
||||
interface eth0 {
|
||||
+ ipv4 {
|
||||
@@ -121,7 +181,7 @@ interfaces {
|
||||
Apply the changes (from candidate to `running-config`):
|
||||
|
||||
```
|
||||
admin@host:/config/interfaces/> leave
|
||||
admin@host:/config/interface/eth0/> leave
|
||||
admin@host:/> show running-config
|
||||
...
|
||||
interfaces {
|
||||
@@ -199,11 +259,11 @@ pair which is useful for connecting, e.g., a container to the physical
|
||||
world. Here we also add an IPv4 address to one end of the pair.
|
||||
|
||||
```
|
||||
admin@host:/config/> edit interfaces interface veth0a
|
||||
admin@host:/config/interfaces/interface/veth0a/> set veth peer veth0b
|
||||
admin@host:/config/interfaces/interface/veth0a/> set ipv4 address 192.168.0.1 prefix-length 24
|
||||
admin@host:/config/interfaces/interface/veth0a/> up
|
||||
admin@host:/config/interfaces/> diff
|
||||
admin@host:/config/> edit interface veth0a
|
||||
admin@host:/config/interface/veth0a/> set veth peer veth0b
|
||||
admin@host:/config/interface/veth0a/> set ipv4 address 192.168.0.1 prefix-length 24
|
||||
admin@host:/config/interface/veth0a/> up
|
||||
admin@host:/config/> diff
|
||||
interfaces {
|
||||
+ interface veth0a {
|
||||
+ type veth;
|
||||
@@ -223,7 +283,7 @@ interfaces {
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
admin@host:/config/interfaces/> leave
|
||||
admin@host:/config/> leave
|
||||
```
|
||||
|
||||
See the bridging example below for more.
|
||||
@@ -241,12 +301,12 @@ between both its bridge ports: `eth0` and `vet0b`.
|
||||
|
||||
```
|
||||
admin@host:/> configure
|
||||
admin@host:/config/> edit interfaces interface br0
|
||||
admin@host:/config/interfaces/interface/br0/> set bridge ieee-group-forward lldp
|
||||
admin@host:/config/interfaces/interface/br0/> up
|
||||
admin@host:/config/interfaces/> set interface eth0 bridge-port bridge br0
|
||||
admin@host:/config/interfaces/> set interface veth0b bridge-port bridge br0
|
||||
admin@host:/config/interfaces/> diff
|
||||
admin@host:/config/> edit interface br0
|
||||
admin@host:/config/interface/br0/> set bridge ieee-group-forward lldp
|
||||
admin@host:/config/interface/br0/> up
|
||||
admin@host:/config/> set interface eth0 bridge-port bridge br0
|
||||
admin@host:/config/> set interface veth0b bridge-port bridge br0
|
||||
admin@host:/config/> diff
|
||||
interfaces {
|
||||
+ interface br0 {
|
||||
+ type bridge;
|
||||
|
||||
@@ -5,7 +5,7 @@ Containers in Infix
|
||||
* [Docker Containers with Podman](#docker-containers-with-podman)
|
||||
* [Multiple Networks](#multiple-networks)
|
||||
* [Hybrid Mode](#hybrid-mode)
|
||||
* [Enabling Containers](#enabling-containers)
|
||||
* [Enabling Container Support](#enabling-container-support)
|
||||
* [Debugging Containers](#debugging-containers)
|
||||
|
||||
|
||||
@@ -57,10 +57,10 @@ inside the container will always be: `eth0`, `eth1`, etc.
|
||||
|
||||
A common setup is to use a VETH pair, with one end in the container and
|
||||
the other end routed, or bridged, to the rest of the world. The Infix
|
||||
[CLI Guide](cli/introduction.md) provides examples of both. In either case you need
|
||||
to create a matching CNI profile for one end of the VETH pair before
|
||||
starting the container, here we use two network profiles, the default
|
||||
podman bridge and the VETH profile:
|
||||
[CLI Guide](cli/introduction.md) provides examples of both. In either
|
||||
case you need to create a matching CNI profile for one end of the VETH
|
||||
pair before starting the container, here we use two network profiles,
|
||||
the default podman bridge and the VETH profile:
|
||||
|
||||
cni create host net1 veth0a 192.168.0.42/24
|
||||
podman run -d --rm --net=podman,net1 --entrypoint "/linuxrc" \
|
||||
@@ -160,7 +160,7 @@ downloaded with `podman pull docker://troglobit/buildroot:latest` and
|
||||
a container created (above):
|
||||
|
||||
```
|
||||
root@infix:/cfg/start.d$ cat <<EOF >20-enable-container.sh
|
||||
root@infix:/cfg/start.d$ cat <<HERE >20-enable-container.sh
|
||||
#!/bin/sh
|
||||
# Remember to create the veth0a <--> vet0b pair in the CLI first!
|
||||
cni create host net1 veth0a 192.168.0.42/24
|
||||
@@ -169,6 +169,7 @@ service name:pod :system pid:!/run/pod:system.pid podman --syslog start system -
|
||||
EOF
|
||||
initctl enable pod:system
|
||||
exit 0
|
||||
HERE
|
||||
root@infix:/cfg/start.d$ chmod +x 20-enable-container.sh
|
||||
```
|
||||
|
||||
|
||||
@@ -1,11 +1,26 @@
|
||||
Developer's Guide
|
||||
=================
|
||||
|
||||
Please note, by default the `root` account is disabled in Infix NETCONF
|
||||
builds. Meaning, the only way to access the system is with the `admin`
|
||||
account, which is created based on credentials found in the VPD area --
|
||||
for Qemu devices this is emulated using `qemu_fw_cfg`.
|
||||
|
||||
For developers this can be quite frustrating to be blocked from logging
|
||||
in to debug the system. So we recommend enabling the `root` account in
|
||||
the Buildroot `make menuconfig` system.
|
||||
|
||||
make menuconfig
|
||||
-> System configuration
|
||||
-> [*]Enable root login with password
|
||||
|
||||
|
||||
Cloning
|
||||
-------
|
||||
|
||||
Please see the [Contributing](#contributing) section, below, for details
|
||||
on how to fork and clone when contributing to Infix.
|
||||
When [pre-built releases][0] are not enough, for instance when you want
|
||||
to add or modify some Open Source components, you can clone the Infix
|
||||
tree to your PC:
|
||||
|
||||
```bash
|
||||
$ mkdir ~/Projects; cd ~/Projects
|
||||
@@ -14,6 +29,10 @@ $ cd infix/
|
||||
$ git submodule update --init
|
||||
```
|
||||
|
||||
> Please see the [Contributing](#contributing) section, below, for
|
||||
> details on how to fork and clone when contributing to Infix.
|
||||
|
||||
|
||||
### Customer Builds
|
||||
|
||||
Customer builds add product specific device trees, more OSS packages,
|
||||
@@ -39,12 +58,21 @@ Building
|
||||
--------
|
||||
|
||||
Buildroot is almost stand-alone, it needs a few locally installed tools
|
||||
to bootstrap itself. For details, see the [excellent manual][manual].
|
||||
to bootstrap itself. The most common ones are usually part of the base
|
||||
install of the OS, but specific ones for building need the following.
|
||||
The instructions here are for Debian/Ubuntu based systems (YMMV):
|
||||
|
||||
> **Note:** installation for Debian/Ubuntu based systems: <kbd>sudo apt
|
||||
> install make libssl-dev</kbd>
|
||||
```bash
|
||||
$ sudo apt install bc binutils build-essential bzip2 cpio \
|
||||
diffutils file findutils git gzip \
|
||||
libncurses-dev libssl-dev perl patch \
|
||||
python rsync sed tar unzip wget
|
||||
```
|
||||
|
||||
Briefly, to build an Infix image; select the target and then make:
|
||||
> For details, see the Getting Started and System Requirements sections
|
||||
> of the [excellent manual][1].
|
||||
|
||||
To build an Infix image; select the target and then make:
|
||||
|
||||
make x86_64_defconfig
|
||||
make
|
||||
@@ -58,6 +86,32 @@ To see available defconfigs for supported targets, use:
|
||||
make list-defconfigs
|
||||
|
||||
|
||||
Development
|
||||
-----------
|
||||
|
||||
When changing a package, locally kept sources, or when using [`local.mk`](override-package.md),
|
||||
you only want to rebuild the parts you have modified:
|
||||
|
||||
make foo-rebuild
|
||||
|
||||
or
|
||||
|
||||
make foo-reconfigure
|
||||
|
||||
or, when nothing seems to bite:
|
||||
|
||||
make foo-dirclean foo-rebuild
|
||||
|
||||
As shown here, you can combine multiple build targets and steps in one
|
||||
go, like this:
|
||||
|
||||
make foo-rebuild bar-rebuild all run
|
||||
|
||||
This rebuilds (and installs) `foo` and `bar`, the `all` target calls
|
||||
on Buildroot to finalize the target filesystem and generate the images.
|
||||
The final `run` argument is explained below.
|
||||
|
||||
|
||||
Testing
|
||||
-------
|
||||
|
||||
@@ -105,5 +159,6 @@ $ git submodule update --init
|
||||
is highly recommended as a baseline and reference. For integration
|
||||
of local changes another company-specific branch can be used instead.
|
||||
|
||||
[0]: https://github.com/kernelkit/infix/releases
|
||||
[1]: https://buildroot.org/downloads/manual/manual.html
|
||||
[2]: https://github.com/wkz/qeneth
|
||||
|
||||
@@ -41,8 +41,9 @@ admin@infix-00-00-00:~$
|
||||
|
||||
## Discovery mechanisms available in Infix
|
||||
|
||||
Infix advertises its presence via the [mDNS](#mdns) and [SSDP](#ssdp) discovery
|
||||
protocols in addition to [LLDP](#lldp).
|
||||
Infix advertises its presence via the [mDNS](#mdns) and [LLDP](#lldp)
|
||||
discovery protocols.
|
||||
|
||||
|
||||
### LLDP
|
||||
|
||||
@@ -173,29 +174,3 @@ linux-pc:#
|
||||
[^2]: [mdns-scan](http://0pointer.de/lennart/projects/mdns-scan/): a
|
||||
tool for scanning for mDNS/DNS-SD published services on the local
|
||||
network
|
||||
|
||||
### SSDP
|
||||
|
||||
For Windows clients, Infix advertises itself via the SSDP
|
||||
protocol. The Infix unit will appear as a *Network Infrastructure*
|
||||
equipment icon in the *Network* tab of Windows Explorer.
|
||||
|
||||
In Linux, the *ssdp-scan*[^3] tool can be used to find Infix units via
|
||||
SSDP.
|
||||
|
||||
```
|
||||
linux-pc:# ssdp-scan tap0
|
||||
+ infix-00-00-00 http://10.0.1.1
|
||||
linux-pc:#
|
||||
```
|
||||
|
||||
> Note 1: Infix presents itself with a HTTP URL, however, currently no
|
||||
> Web server is running. Still, the IP address 10.0.1.1 is discovered
|
||||
> and can be used for SSH access, etc.
|
||||
|
||||
> Note 2: SSDP is limited to IPv4. Thus, it is only valid as discovery
|
||||
> mechanism when Infix as well as the client PC has an IPv4 address
|
||||
> assigned.
|
||||
|
||||
[^3]: [SSDP Responder for
|
||||
Linux/UNIX](https://github.com/troglobit/ssdp-responder)
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
# YANG to Ethtool Mapping
|
||||
This column contains the mapping between YANG and Linux / Ethtool counters.
|
||||
|
||||
```
|
||||
┌─────────────────────────────────┬──────────────────────────────────┐
|
||||
│ YANG │ Linux / Ethtool │
|
||||
├─────────────────────────────────┼──────────────────────────────────┤
|
||||
│ out-frames │ FramesTransmittedOK │
|
||||
├─────────────────────────────────┼──────────────────────────────────┤
|
||||
│ out-multicast-frames │ MulticastFramesXmittedOK │
|
||||
├─────────────────────────────────┼──────────────────────────────────┤
|
||||
│ out-broadcast-frames │ BroadcastFramesXmittedOK │
|
||||
├─────────────────────────────────┼──────────────────────────────────┤
|
||||
│ in-total-frames │ FramesReceivedOK, │
|
||||
│ │ FrameCheckSequenceErrors │
|
||||
│ │ FramesLostDueToIntMACRcvError │
|
||||
│ │ AlignmentErrors │
|
||||
│ │ etherStatsOversizePkts │
|
||||
│ │ etherStatsJabbers │
|
||||
├─────────────────────────────────┼──────────────────────────────────┤
|
||||
│ in-frames │ FramesReceivedOK │
|
||||
├─────────────────────────────────┼──────────────────────────────────┤
|
||||
│ in-multicast-frames │ MulticastFramesReceivedOK │
|
||||
├─────────────────────────────────┼──────────────────────────────────┤
|
||||
│ in-broadcast-frames │ BroadcastFramesReceivedOK │
|
||||
├─────────────────────────────────┼──────────────────────────────────┤
|
||||
│ in-error-undersize-frames │ undersize_pkts │
|
||||
├─────────────────────────────────┼──────────────────────────────────┤
|
||||
│ in-error-fcs-frames │ FrameCheckSequenceErrors │
|
||||
└─────────────────────────────────┴──────────────────────────────────┘
|
||||
```
|
||||
|
After Width: | Height: | Size: 135 KiB |
|
After Width: | Height: | Size: 61 KiB |
@@ -0,0 +1,566 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="249.12pt"
|
||||
height="73.919998pt"
|
||||
viewBox="0 0 249.12 73.919998"
|
||||
version="1.1"
|
||||
id="svg230"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs94">
|
||||
<g
|
||||
id="g89">
|
||||
<g
|
||||
id="glyph-0-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.625 L 5.625 -5.625 L 5.625 0 Z M 1.265625 -0.140625 L 5.484375 -0.140625 L 5.484375 -5.484375 L 1.265625 -5.484375 Z M 1.265625 -0.140625 "
|
||||
id="path2" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-1">
|
||||
<path
|
||||
d="M 3.34375 -1.484375 L 4.578125 -1.28125 C 4.421875 -0.832031 4.171875 -0.488281 3.828125 -0.25 C 3.484375 -0.0078125 3.054688 0.109375 2.546875 0.109375 C 1.734375 0.109375 1.132813 -0.15625 0.75 -0.6875 C 0.4375 -1.113281 0.28125 -1.648438 0.28125 -2.296875 C 0.28125 -3.066406 0.484375 -3.671875 0.890625 -4.109375 C 1.296875 -4.546875 1.804688 -4.765625 2.421875 -4.765625 C 3.117188 -4.765625 3.664063 -4.535156 4.0625 -4.078125 C 4.46875 -3.617188 4.660156 -2.921875 4.640625 -1.984375 L 1.546875 -1.984375 C 1.554688 -1.609375 1.65625 -1.316406 1.84375 -1.109375 C 2.039063 -0.910156 2.28125 -0.8125 2.5625 -0.8125 C 2.757813 -0.8125 2.921875 -0.863281 3.046875 -0.96875 C 3.179688 -1.082031 3.28125 -1.253906 3.34375 -1.484375 Z M 3.421875 -2.734375 C 3.410156 -3.085938 3.316406 -3.359375 3.140625 -3.546875 C 2.960938 -3.734375 2.75 -3.828125 2.5 -3.828125 C 2.226563 -3.828125 2.003906 -3.726563 1.828125 -3.53125 C 1.648438 -3.332031 1.566406 -3.066406 1.578125 -2.734375 Z M 3.421875 -2.734375 "
|
||||
id="path5" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-2">
|
||||
<path
|
||||
d="M 0.046875 0 L 1.734375 -2.40625 L 0.125 -4.671875 L 1.625 -4.671875 L 2.453125 -3.390625 L 3.328125 -4.671875 L 4.78125 -4.671875 L 3.1875 -2.453125 L 4.921875 0 L 3.40625 0 L 2.453125 -1.453125 L 1.5 0 Z M 0.046875 0 "
|
||||
id="path8" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-3">
|
||||
<path
|
||||
d="M 1.5625 -3.25 L 0.453125 -3.453125 C 0.578125 -3.898438 0.789063 -4.226563 1.09375 -4.4375 C 1.40625 -4.65625 1.863281 -4.765625 2.46875 -4.765625 C 3.019531 -4.765625 3.429688 -4.695313 3.703125 -4.5625 C 3.972656 -4.4375 4.160156 -4.273438 4.265625 -4.078125 C 4.378906 -3.878906 4.4375 -3.507813 4.4375 -2.96875 L 4.421875 -1.53125 C 4.421875 -1.125 4.441406 -0.820313 4.484375 -0.625 C 4.523438 -0.425781 4.597656 -0.21875 4.703125 0 L 3.484375 0 C 3.453125 -0.0820313 3.410156 -0.203125 3.359375 -0.359375 C 3.335938 -0.429688 3.320313 -0.484375 3.3125 -0.515625 C 3.101563 -0.304688 2.878906 -0.148438 2.640625 -0.046875 C 2.398438 0.0546875 2.144531 0.109375 1.875 0.109375 C 1.394531 0.109375 1.015625 -0.0195313 0.734375 -0.28125 C 0.460938 -0.539063 0.328125 -0.875 0.328125 -1.28125 C 0.328125 -1.539063 0.390625 -1.773438 0.515625 -1.984375 C 0.640625 -2.191406 0.8125 -2.347656 1.03125 -2.453125 C 1.257813 -2.566406 1.585938 -2.664063 2.015625 -2.75 C 2.597656 -2.851563 3 -2.953125 3.21875 -3.046875 L 3.21875 -3.171875 C 3.21875 -3.410156 3.160156 -3.578125 3.046875 -3.671875 C 2.929688 -3.773438 2.707031 -3.828125 2.375 -3.828125 C 2.15625 -3.828125 1.984375 -3.78125 1.859375 -3.6875 C 1.742188 -3.601563 1.644531 -3.457031 1.5625 -3.25 Z M 3.21875 -2.234375 C 3.0625 -2.179688 2.8125 -2.117188 2.46875 -2.046875 C 2.125 -1.972656 1.898438 -1.90625 1.796875 -1.84375 C 1.640625 -1.726563 1.5625 -1.582031 1.5625 -1.40625 C 1.5625 -1.226563 1.625 -1.078125 1.75 -0.953125 C 1.875 -0.828125 2.035156 -0.765625 2.234375 -0.765625 C 2.460938 -0.765625 2.675781 -0.835938 2.875 -0.984375 C 3.03125 -1.097656 3.128906 -1.234375 3.171875 -1.390625 C 3.203125 -1.492188 3.21875 -1.695313 3.21875 -2 Z M 3.21875 -2.234375 "
|
||||
id="path11" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-4">
|
||||
<path
|
||||
d="M 0.546875 -4.671875 L 1.6875 -4.671875 L 1.6875 -4.03125 C 2.09375 -4.519531 2.578125 -4.765625 3.140625 -4.765625 C 3.441406 -4.765625 3.703125 -4.703125 3.921875 -4.578125 C 4.140625 -4.460938 4.320313 -4.28125 4.46875 -4.03125 C 4.664063 -4.28125 4.882813 -4.460938 5.125 -4.578125 C 5.363281 -4.703125 5.617188 -4.765625 5.890625 -4.765625 C 6.234375 -4.765625 6.519531 -4.695313 6.75 -4.5625 C 6.988281 -4.425781 7.171875 -4.222656 7.296875 -3.953125 C 7.378906 -3.753906 7.421875 -3.429688 7.421875 -2.984375 L 7.421875 0 L 6.1875 0 L 6.1875 -2.671875 C 6.1875 -3.128906 6.144531 -3.425781 6.0625 -3.5625 C 5.945313 -3.738281 5.769531 -3.828125 5.53125 -3.828125 C 5.351563 -3.828125 5.1875 -3.773438 5.03125 -3.671875 C 4.882813 -3.566406 4.773438 -3.410156 4.703125 -3.203125 C 4.640625 -3.003906 4.609375 -2.679688 4.609375 -2.234375 L 4.609375 0 L 3.375 0 L 3.375 -2.5625 C 3.375 -3.007813 3.351563 -3.300781 3.3125 -3.4375 C 3.269531 -3.570313 3.203125 -3.671875 3.109375 -3.734375 C 3.015625 -3.796875 2.890625 -3.828125 2.734375 -3.828125 C 2.535156 -3.828125 2.359375 -3.773438 2.203125 -3.671875 C 2.054688 -3.566406 1.945313 -3.414063 1.875 -3.21875 C 1.8125 -3.03125 1.78125 -2.710938 1.78125 -2.265625 L 1.78125 0 L 0.546875 0 Z M 0.546875 -4.671875 "
|
||||
id="path14" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-5">
|
||||
<path
|
||||
d="M 0.609375 -4.671875 L 1.765625 -4.671875 L 1.765625 -3.984375 C 1.910156 -4.210938 2.109375 -4.398438 2.359375 -4.546875 C 2.617188 -4.691406 2.90625 -4.765625 3.21875 -4.765625 C 3.757813 -4.765625 4.21875 -4.550781 4.59375 -4.125 C 4.96875 -3.707031 5.15625 -3.117188 5.15625 -2.359375 C 5.15625 -1.578125 4.960938 -0.96875 4.578125 -0.53125 C 4.203125 -0.101563 3.742188 0.109375 3.203125 0.109375 C 2.953125 0.109375 2.71875 0.0546875 2.5 -0.046875 C 2.289063 -0.148438 2.070313 -0.328125 1.84375 -0.578125 L 1.84375 1.78125 L 0.609375 1.78125 Z M 1.828125 -2.40625 C 1.828125 -1.882813 1.929688 -1.5 2.140625 -1.25 C 2.347656 -1 2.601563 -0.875 2.90625 -0.875 C 3.1875 -0.875 3.421875 -0.988281 3.609375 -1.21875 C 3.804688 -1.445313 3.90625 -1.820313 3.90625 -2.34375 C 3.90625 -2.832031 3.804688 -3.195313 3.609375 -3.4375 C 3.410156 -3.675781 3.171875 -3.796875 2.890625 -3.796875 C 2.585938 -3.796875 2.332031 -3.675781 2.125 -3.4375 C 1.925781 -3.207031 1.828125 -2.863281 1.828125 -2.40625 Z M 1.828125 -2.40625 "
|
||||
id="path17" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-6">
|
||||
<path
|
||||
d="M 0.640625 0 L 0.640625 -6.4375 L 1.875 -6.4375 L 1.875 0 Z M 0.640625 0 "
|
||||
id="path20" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-7">
|
||||
<path
|
||||
d="M 0.65625 -6.4375 L 3.03125 -6.4375 C 3.5625 -6.4375 3.96875 -6.394531 4.25 -6.3125 C 4.632813 -6.207031 4.957031 -6.007813 5.21875 -5.71875 C 5.488281 -5.4375 5.691406 -5.085938 5.828125 -4.671875 C 5.972656 -4.265625 6.046875 -3.757813 6.046875 -3.15625 C 6.046875 -2.625 5.984375 -2.164063 5.859375 -1.78125 C 5.691406 -1.3125 5.457031 -0.9375 5.15625 -0.65625 C 4.9375 -0.4375 4.632813 -0.265625 4.25 -0.140625 C 3.957031 -0.046875 3.570313 0 3.09375 0 L 0.65625 0 Z M 1.953125 -5.359375 L 1.953125 -1.078125 L 2.921875 -1.078125 C 3.285156 -1.078125 3.546875 -1.097656 3.703125 -1.140625 C 3.921875 -1.191406 4.097656 -1.28125 4.234375 -1.40625 C 4.367188 -1.539063 4.476563 -1.75 4.5625 -2.03125 C 4.65625 -2.320313 4.703125 -2.71875 4.703125 -3.21875 C 4.703125 -3.71875 4.65625 -4.097656 4.5625 -4.359375 C 4.476563 -4.628906 4.359375 -4.835938 4.203125 -4.984375 C 4.046875 -5.140625 3.847656 -5.242188 3.609375 -5.296875 C 3.421875 -5.335938 3.0625 -5.359375 2.53125 -5.359375 Z M 1.953125 -5.359375 "
|
||||
id="path23" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-8">
|
||||
<path
|
||||
d="M 0.65625 0 L 0.65625 -6.4375 L 1.953125 -6.4375 L 1.953125 -3.90625 L 4.515625 -3.90625 L 4.515625 -6.4375 L 5.8125 -6.4375 L 5.8125 0 L 4.515625 0 L 4.515625 -2.8125 L 1.953125 -2.8125 L 1.953125 0 Z M 0.65625 0 "
|
||||
id="path26" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-9">
|
||||
<path
|
||||
d="M 4.78125 -2.375 L 6.03125 -1.96875 C 5.84375 -1.269531 5.523438 -0.75 5.078125 -0.40625 C 4.628906 -0.0625 4.054688 0.109375 3.359375 0.109375 C 2.503906 0.109375 1.800781 -0.179688 1.25 -0.765625 C 0.695313 -1.347656 0.421875 -2.148438 0.421875 -3.171875 C 0.421875 -4.234375 0.695313 -5.0625 1.25 -5.65625 C 1.8125 -6.25 2.539063 -6.546875 3.4375 -6.546875 C 4.226563 -6.546875 4.867188 -6.316406 5.359375 -5.859375 C 5.648438 -5.578125 5.867188 -5.179688 6.015625 -4.671875 L 4.734375 -4.359375 C 4.660156 -4.691406 4.5 -4.953125 4.25 -5.140625 C 4.007813 -5.335938 3.71875 -5.4375 3.375 -5.4375 C 2.894531 -5.4375 2.503906 -5.265625 2.203125 -4.921875 C 1.910156 -4.578125 1.765625 -4.023438 1.765625 -3.265625 C 1.765625 -2.453125 1.910156 -1.867188 2.203125 -1.515625 C 2.492188 -1.171875 2.875 -1 3.34375 -1 C 3.695313 -1 3.992188 -1.109375 4.234375 -1.328125 C 4.484375 -1.546875 4.664063 -1.894531 4.78125 -2.375 Z M 4.78125 -2.375 "
|
||||
id="path29" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-10">
|
||||
<path
|
||||
d="M 0.65625 0 L 0.65625 -6.4375 L 2.75 -6.4375 C 3.53125 -6.4375 4.046875 -6.40625 4.296875 -6.34375 C 4.660156 -6.25 4.96875 -6.039063 5.21875 -5.71875 C 5.46875 -5.394531 5.59375 -4.972656 5.59375 -4.453125 C 5.59375 -4.066406 5.519531 -3.738281 5.375 -3.46875 C 5.226563 -3.195313 5.046875 -2.984375 4.828125 -2.828125 C 4.609375 -2.671875 4.382813 -2.566406 4.15625 -2.515625 C 3.84375 -2.460938 3.390625 -2.4375 2.796875 -2.4375 L 1.953125 -2.4375 L 1.953125 0 Z M 1.953125 -5.359375 L 1.953125 -3.53125 L 2.671875 -3.53125 C 3.179688 -3.53125 3.519531 -3.5625 3.6875 -3.625 C 3.863281 -3.695313 4 -3.800781 4.09375 -3.9375 C 4.195313 -4.082031 4.25 -4.25 4.25 -4.4375 C 4.25 -4.675781 4.179688 -4.867188 4.046875 -5.015625 C 3.910156 -5.171875 3.734375 -5.269531 3.515625 -5.3125 C 3.359375 -5.34375 3.046875 -5.359375 2.578125 -5.359375 Z M 1.953125 -5.359375 "
|
||||
id="path32" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-11">
|
||||
<path
|
||||
d="M 0.328125 -2.09375 L 1.59375 -2.21875 C 1.664063 -1.789063 1.816406 -1.476563 2.046875 -1.28125 C 2.285156 -1.082031 2.601563 -0.984375 3 -0.984375 C 3.414063 -0.984375 3.726563 -1.070313 3.9375 -1.25 C 4.15625 -1.425781 4.265625 -1.632813 4.265625 -1.875 C 4.265625 -2.019531 4.21875 -2.144531 4.125 -2.25 C 4.039063 -2.363281 3.882813 -2.460938 3.65625 -2.546875 C 3.507813 -2.597656 3.164063 -2.691406 2.625 -2.828125 C 1.925781 -2.992188 1.4375 -3.203125 1.15625 -3.453125 C 0.757813 -3.804688 0.5625 -4.238281 0.5625 -4.75 C 0.5625 -5.082031 0.648438 -5.390625 0.828125 -5.671875 C 1.015625 -5.960938 1.285156 -6.179688 1.640625 -6.328125 C 1.992188 -6.472656 2.414063 -6.546875 2.90625 -6.546875 C 3.71875 -6.546875 4.328125 -6.367188 4.734375 -6.015625 C 5.140625 -5.660156 5.351563 -5.1875 5.375 -4.59375 L 4.078125 -4.546875 C 4.023438 -4.878906 3.90625 -5.113281 3.71875 -5.25 C 3.539063 -5.394531 3.265625 -5.46875 2.890625 -5.46875 C 2.515625 -5.46875 2.222656 -5.394531 2.015625 -5.25 C 1.867188 -5.144531 1.796875 -5.007813 1.796875 -4.84375 C 1.796875 -4.6875 1.863281 -4.554688 2 -4.453125 C 2.15625 -4.316406 2.550781 -4.171875 3.1875 -4.015625 C 3.820313 -3.867188 4.289063 -3.710938 4.59375 -3.546875 C 4.894531 -3.390625 5.128906 -3.171875 5.296875 -2.890625 C 5.472656 -2.617188 5.5625 -2.28125 5.5625 -1.875 C 5.5625 -1.507813 5.457031 -1.164063 5.25 -0.84375 C 5.050781 -0.519531 4.765625 -0.28125 4.390625 -0.125 C 4.015625 0.03125 3.546875 0.109375 2.984375 0.109375 C 2.171875 0.109375 1.546875 -0.078125 1.109375 -0.453125 C 0.671875 -0.828125 0.410156 -1.375 0.328125 -2.09375 Z M 0.328125 -2.09375 "
|
||||
id="path35" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-12">
|
||||
<path
|
||||
d="M 1.828125 0 L 0.59375 0 L 0.59375 -4.671875 L 1.734375 -4.671875 L 1.734375 -4 C 1.929688 -4.3125 2.109375 -4.515625 2.265625 -4.609375 C 2.421875 -4.710938 2.597656 -4.765625 2.796875 -4.765625 C 3.078125 -4.765625 3.347656 -4.691406 3.609375 -4.546875 L 3.234375 -3.46875 C 3.023438 -3.601563 2.832031 -3.671875 2.65625 -3.671875 C 2.476563 -3.671875 2.328125 -3.617188 2.203125 -3.515625 C 2.085938 -3.421875 1.992188 -3.25 1.921875 -3 C 1.859375 -2.75 1.828125 -2.226563 1.828125 -1.4375 Z M 1.828125 0 "
|
||||
id="path38" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-13">
|
||||
<path
|
||||
d="M 1.921875 0 L 0.046875 -4.671875 L 1.34375 -4.671875 L 2.21875 -2.28125 L 2.484375 -1.484375 C 2.546875 -1.691406 2.585938 -1.828125 2.609375 -1.890625 C 2.648438 -2.023438 2.691406 -2.15625 2.734375 -2.28125 L 3.625 -4.671875 L 4.890625 -4.671875 L 3.046875 0 Z M 1.921875 0 "
|
||||
id="path41" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.625 L 5.625 -5.625 L 5.625 0 Z M 1.265625 -0.140625 L 5.484375 -0.140625 L 5.484375 -5.484375 L 1.265625 -5.484375 Z M 1.265625 -0.140625 "
|
||||
id="path44" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-1">
|
||||
<path
|
||||
d="M 3.78125 -1.5 L 4.609375 -1.40625 C 4.472656 -0.925781 4.226563 -0.550781 3.875 -0.28125 C 3.53125 -0.0195313 3.085938 0.109375 2.546875 0.109375 C 1.867188 0.109375 1.328125 -0.0976563 0.921875 -0.515625 C 0.523438 -0.941406 0.328125 -1.535156 0.328125 -2.296875 C 0.328125 -3.078125 0.53125 -3.679688 0.9375 -4.109375 C 1.34375 -4.546875 1.867188 -4.765625 2.515625 -4.765625 C 3.140625 -4.765625 3.644531 -4.550781 4.03125 -4.125 C 4.425781 -3.707031 4.625 -3.113281 4.625 -2.34375 C 4.625 -2.289063 4.625 -2.21875 4.625 -2.125 L 1.140625 -2.125 C 1.171875 -1.613281 1.316406 -1.222656 1.578125 -0.953125 C 1.835938 -0.679688 2.164063 -0.546875 2.5625 -0.546875 C 2.851563 -0.546875 3.097656 -0.617188 3.296875 -0.765625 C 3.503906 -0.921875 3.664063 -1.164063 3.78125 -1.5 Z M 1.1875 -2.78125 L 3.796875 -2.78125 C 3.765625 -3.175781 3.664063 -3.472656 3.5 -3.671875 C 3.25 -3.972656 2.921875 -4.125 2.515625 -4.125 C 2.148438 -4.125 1.84375 -4 1.59375 -3.75 C 1.351563 -3.507813 1.21875 -3.1875 1.1875 -2.78125 Z M 1.1875 -2.78125 "
|
||||
id="path47" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-2">
|
||||
<path
|
||||
d="M 2.328125 -0.703125 L 2.4375 -0.015625 C 2.207031 0.0351563 2.007813 0.0625 1.84375 0.0625 C 1.550781 0.0625 1.328125 0.015625 1.171875 -0.078125 C 1.015625 -0.171875 0.898438 -0.289063 0.828125 -0.4375 C 0.765625 -0.582031 0.734375 -0.890625 0.734375 -1.359375 L 0.734375 -4.046875 L 0.15625 -4.046875 L 0.15625 -4.671875 L 0.734375 -4.671875 L 0.734375 -5.828125 L 1.53125 -6.296875 L 1.53125 -4.671875 L 2.328125 -4.671875 L 2.328125 -4.046875 L 1.53125 -4.046875 L 1.53125 -1.328125 C 1.53125 -1.097656 1.539063 -0.953125 1.5625 -0.890625 C 1.59375 -0.828125 1.640625 -0.773438 1.703125 -0.734375 C 1.765625 -0.691406 1.851563 -0.671875 1.96875 -0.671875 C 2.0625 -0.671875 2.179688 -0.679688 2.328125 -0.703125 Z M 2.328125 -0.703125 "
|
||||
id="path50" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-3">
|
||||
<path
|
||||
d="M 0.59375 0 L 0.59375 -6.4375 L 1.390625 -6.4375 L 1.390625 -4.125 C 1.753906 -4.550781 2.21875 -4.765625 2.78125 -4.765625 C 3.125 -4.765625 3.421875 -4.695313 3.671875 -4.5625 C 3.929688 -4.425781 4.113281 -4.238281 4.21875 -4 C 4.332031 -3.757813 4.390625 -3.410156 4.390625 -2.953125 L 4.390625 0 L 3.609375 0 L 3.609375 -2.953125 C 3.609375 -3.347656 3.519531 -3.632813 3.34375 -3.8125 C 3.175781 -4 2.9375 -4.09375 2.625 -4.09375 C 2.382813 -4.09375 2.160156 -4.03125 1.953125 -3.90625 C 1.742188 -3.789063 1.597656 -3.628906 1.515625 -3.421875 C 1.429688 -3.210938 1.390625 -2.921875 1.390625 -2.546875 L 1.390625 0 Z M 0.59375 0 "
|
||||
id="path53" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-4">
|
||||
<path
|
||||
d="M 0.375 -3.171875 C 0.375 -3.929688 0.453125 -4.546875 0.609375 -5.015625 C 0.765625 -5.484375 0.992188 -5.84375 1.296875 -6.09375 C 1.609375 -6.34375 2 -6.46875 2.46875 -6.46875 C 2.820313 -6.46875 3.128906 -6.394531 3.390625 -6.25 C 3.648438 -6.113281 3.863281 -5.914063 4.03125 -5.65625 C 4.195313 -5.394531 4.328125 -5.078125 4.421875 -4.703125 C 4.523438 -4.328125 4.578125 -3.816406 4.578125 -3.171875 C 4.578125 -2.421875 4.5 -1.8125 4.34375 -1.34375 C 4.1875 -0.882813 3.953125 -0.523438 3.640625 -0.265625 C 3.335938 -0.015625 2.945313 0.109375 2.46875 0.109375 C 1.851563 0.109375 1.367188 -0.113281 1.015625 -0.5625 C 0.585938 -1.09375 0.375 -1.960938 0.375 -3.171875 Z M 1.1875 -3.171875 C 1.1875 -2.117188 1.304688 -1.414063 1.546875 -1.0625 C 1.796875 -0.71875 2.101563 -0.546875 2.46875 -0.546875 C 2.832031 -0.546875 3.140625 -0.71875 3.390625 -1.0625 C 3.640625 -1.414063 3.765625 -2.117188 3.765625 -3.171875 C 3.765625 -4.234375 3.640625 -4.9375 3.390625 -5.28125 C 3.140625 -5.632813 2.832031 -5.8125 2.46875 -5.8125 C 2.101563 -5.8125 1.8125 -5.660156 1.59375 -5.359375 C 1.320313 -4.960938 1.1875 -4.234375 1.1875 -3.171875 Z M 1.1875 -3.171875 "
|
||||
id="path56" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-5">
|
||||
<path
|
||||
d="M 0.6875 0 L 0.6875 -6.4375 L 3.125 -6.4375 C 3.550781 -6.4375 3.878906 -6.414063 4.109375 -6.375 C 4.421875 -6.320313 4.679688 -6.222656 4.890625 -6.078125 C 5.109375 -5.929688 5.28125 -5.722656 5.40625 -5.453125 C 5.539063 -5.191406 5.609375 -4.898438 5.609375 -4.578125 C 5.609375 -4.023438 5.429688 -3.5625 5.078125 -3.1875 C 4.734375 -2.8125 4.109375 -2.625 3.203125 -2.625 L 1.546875 -2.625 L 1.546875 0 Z M 1.546875 -3.375 L 3.21875 -3.375 C 3.757813 -3.375 4.144531 -3.476563 4.375 -3.6875 C 4.613281 -3.894531 4.734375 -4.179688 4.734375 -4.546875 C 4.734375 -4.816406 4.664063 -5.046875 4.53125 -5.234375 C 4.394531 -5.429688 4.210938 -5.5625 3.984375 -5.625 C 3.847656 -5.664063 3.582031 -5.6875 3.1875 -5.6875 L 1.546875 -5.6875 Z M 1.546875 -3.375 "
|
||||
id="path59" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-6">
|
||||
<path
|
||||
d="M 0.296875 -2.328125 C 0.296875 -3.191406 0.535156 -3.832031 1.015625 -4.25 C 1.421875 -4.59375 1.910156 -4.765625 2.484375 -4.765625 C 3.128906 -4.765625 3.65625 -4.554688 4.0625 -4.140625 C 4.46875 -3.722656 4.671875 -3.144531 4.671875 -2.40625 C 4.671875 -1.800781 4.578125 -1.328125 4.390625 -0.984375 C 4.210938 -0.640625 3.953125 -0.367188 3.609375 -0.171875 C 3.265625 0.015625 2.890625 0.109375 2.484375 0.109375 C 1.828125 0.109375 1.296875 -0.0976563 0.890625 -0.515625 C 0.492188 -0.941406 0.296875 -1.546875 0.296875 -2.328125 Z M 1.109375 -2.328125 C 1.109375 -1.734375 1.238281 -1.285156 1.5 -0.984375 C 1.757813 -0.691406 2.085938 -0.546875 2.484375 -0.546875 C 2.878906 -0.546875 3.207031 -0.691406 3.46875 -0.984375 C 3.726563 -1.285156 3.859375 -1.742188 3.859375 -2.359375 C 3.859375 -2.929688 3.726563 -3.367188 3.46875 -3.671875 C 3.207031 -3.972656 2.878906 -4.125 2.484375 -4.125 C 2.085938 -4.125 1.757813 -3.972656 1.5 -3.671875 C 1.238281 -3.378906 1.109375 -2.929688 1.109375 -2.328125 Z M 1.109375 -2.328125 "
|
||||
id="path62" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-7">
|
||||
<path
|
||||
d="M 0.578125 0 L 0.578125 -6.4375 L 1.359375 -6.4375 L 1.359375 0 Z M 0.578125 0 "
|
||||
id="path65" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-8">
|
||||
<path
|
||||
d="M 0.8125 -3.765625 L 0.8125 -4.671875 L 1.71875 -4.671875 L 1.71875 -3.765625 Z M 0.8125 0 L 0.8125 -0.90625 L 1.71875 -0.90625 L 1.71875 0 Z M 0.8125 0 "
|
||||
id="path68" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-9">
|
||||
<path
|
||||
d="M 3.359375 0 L 2.5625 0 L 2.5625 -5.046875 C 2.375 -4.859375 2.125 -4.671875 1.8125 -4.484375 C 1.5 -4.304688 1.222656 -4.175781 0.984375 -4.09375 L 0.984375 -4.859375 C 1.421875 -5.054688 1.804688 -5.300781 2.140625 -5.59375 C 2.472656 -5.894531 2.707031 -6.1875 2.84375 -6.46875 L 3.359375 -6.46875 Z M 3.359375 0 "
|
||||
id="path71" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-10">
|
||||
<path
|
||||
d="M 0.8125 0 L 0.8125 -0.90625 L 1.71875 -0.90625 L 1.71875 0 Z M 0.8125 0 "
|
||||
id="path74" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-11">
|
||||
<path
|
||||
d="M 4.53125 -0.765625 L 4.53125 0 L 0.265625 0 C 0.265625 -0.1875 0.296875 -0.367188 0.359375 -0.546875 C 0.472656 -0.835938 0.648438 -1.125 0.890625 -1.40625 C 1.128906 -1.6875 1.472656 -2.007813 1.921875 -2.375 C 2.617188 -2.957031 3.085938 -3.414063 3.328125 -3.75 C 3.578125 -4.082031 3.703125 -4.398438 3.703125 -4.703125 C 3.703125 -5.015625 3.585938 -5.273438 3.359375 -5.484375 C 3.140625 -5.703125 2.851563 -5.8125 2.5 -5.8125 C 2.113281 -5.8125 1.804688 -5.695313 1.578125 -5.46875 C 1.347656 -5.238281 1.234375 -4.921875 1.234375 -4.515625 L 0.421875 -4.609375 C 0.472656 -5.210938 0.679688 -5.671875 1.046875 -5.984375 C 1.410156 -6.304688 1.898438 -6.46875 2.515625 -6.46875 C 3.128906 -6.46875 3.613281 -6.296875 3.96875 -5.953125 C 4.332031 -5.609375 4.515625 -5.1875 4.515625 -4.6875 C 4.515625 -4.425781 4.460938 -4.171875 4.359375 -3.921875 C 4.253906 -3.671875 4.078125 -3.40625 3.828125 -3.125 C 3.585938 -2.851563 3.1875 -2.476563 2.625 -2 C 2.144531 -1.601563 1.835938 -1.332031 1.703125 -1.1875 C 1.566406 -1.039063 1.457031 -0.898438 1.375 -0.765625 Z M 4.53125 -0.765625 "
|
||||
id="path77" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-12">
|
||||
<path
|
||||
d="M 0.28125 -1.9375 L 0.28125 -2.734375 L 2.71875 -2.734375 L 2.71875 -1.9375 Z M 0.28125 -1.9375 "
|
||||
id="path80" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-13">
|
||||
<path
|
||||
d="M 0 0.109375 L 1.875 -6.546875 L 2.5 -6.546875 L 0.640625 0.109375 Z M 0 0.109375 "
|
||||
id="path83" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-14">
|
||||
<path
|
||||
d="M 2.90625 0 L 2.90625 -1.546875 L 0.109375 -1.546875 L 0.109375 -2.265625 L 3.046875 -6.4375 L 3.703125 -6.4375 L 3.703125 -2.265625 L 4.578125 -2.265625 L 4.578125 -1.546875 L 3.703125 -1.546875 L 3.703125 0 Z M 2.90625 -2.265625 L 2.90625 -5.171875 L 0.890625 -2.265625 Z M 2.90625 -2.265625 "
|
||||
id="path86" />
|
||||
</g>
|
||||
</g>
|
||||
<clipPath
|
||||
id="clip-0">
|
||||
<path
|
||||
clip-rule="nonzero"
|
||||
d="M 0 56 L 176 56 L 176 72 L 0 72 Z M 0 56 "
|
||||
id="path91" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(100%, 94.898987%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(83.918762%, 71.369934%, 33.729553%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 1 1 L 81.000003 1 L 81.000003 49.500002 L 1 49.500002 Z M 1 1 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path96" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g112">
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="12.738281"
|
||||
y="17.999998"
|
||||
id="use98" />
|
||||
<use
|
||||
xlink:href="#glyph-0-2"
|
||||
x="17.743652"
|
||||
y="17.999998"
|
||||
id="use100" />
|
||||
<use
|
||||
xlink:href="#glyph-0-3"
|
||||
x="22.749022"
|
||||
y="17.999998"
|
||||
id="use102" />
|
||||
<use
|
||||
xlink:href="#glyph-0-4"
|
||||
x="27.754393"
|
||||
y="17.999998"
|
||||
id="use104" />
|
||||
<use
|
||||
xlink:href="#glyph-0-5"
|
||||
x="35.756832"
|
||||
y="17.999998"
|
||||
id="use106" />
|
||||
<use
|
||||
xlink:href="#glyph-0-6"
|
||||
x="41.254395"
|
||||
y="17.999998"
|
||||
id="use108" />
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="43.754883"
|
||||
y="17.999998"
|
||||
id="use110" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g122">
|
||||
<use
|
||||
xlink:href="#glyph-1-1"
|
||||
x="21.234373"
|
||||
y="33"
|
||||
id="use114" />
|
||||
<use
|
||||
xlink:href="#glyph-1-2"
|
||||
x="26.239744"
|
||||
y="33"
|
||||
id="use116" />
|
||||
<use
|
||||
xlink:href="#glyph-1-3"
|
||||
x="28.740232"
|
||||
y="33"
|
||||
id="use118" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="33.745605"
|
||||
y="33"
|
||||
id="use120" />
|
||||
</g>
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 41.000002 89.500004 L 41.000002 49.500002 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path124" />
|
||||
<g
|
||||
clip-path="url(#clip-0)"
|
||||
id="g128">
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="#000000"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="m 1,89.500004 219.00001,1.5"
|
||||
transform="matrix(0.75,0,0,0.75,0.375,0.375)"
|
||||
id="path126" />
|
||||
</g>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(100%, 100%, 100%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 140.000006 1 L 220.000009 1 L 220.000009 51.000002 L 140.000006 51.000002 Z M 140.000006 1 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path130" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g140">
|
||||
<use
|
||||
xlink:href="#glyph-0-7"
|
||||
x="122.23827"
|
||||
y="17.249998"
|
||||
id="use132" />
|
||||
<use
|
||||
xlink:href="#glyph-0-8"
|
||||
x="128.73779"
|
||||
y="17.249998"
|
||||
id="use134" />
|
||||
<use
|
||||
xlink:href="#glyph-0-9"
|
||||
x="135.2373"
|
||||
y="17.249998"
|
||||
id="use136" />
|
||||
<use
|
||||
xlink:href="#glyph-0-10"
|
||||
x="141.73682"
|
||||
y="17.249998"
|
||||
id="use138" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g154">
|
||||
<use
|
||||
xlink:href="#glyph-0-11"
|
||||
x="120.98437"
|
||||
y="28.499998"
|
||||
id="use142" />
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="126.9873"
|
||||
y="28.499998"
|
||||
id="use144" />
|
||||
<use
|
||||
xlink:href="#glyph-0-12"
|
||||
x="131.99268"
|
||||
y="28.499998"
|
||||
id="use146" />
|
||||
<use
|
||||
xlink:href="#glyph-0-13"
|
||||
x="135.49512"
|
||||
y="28.499998"
|
||||
id="use148" />
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="140.50049"
|
||||
y="28.499998"
|
||||
id="use150" />
|
||||
<use
|
||||
xlink:href="#glyph-0-12"
|
||||
x="145.50586"
|
||||
y="28.499998"
|
||||
id="use152" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g166">
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="174"
|
||||
y="12.749999"
|
||||
id="use156" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="180.00291"
|
||||
y="12.749999"
|
||||
id="use158" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="185.00829"
|
||||
y="12.749999"
|
||||
id="use160" />
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="190.01366"
|
||||
y="12.749999"
|
||||
id="use162" />
|
||||
<use
|
||||
xlink:href="#glyph-1-8"
|
||||
x="192.01318"
|
||||
y="12.749999"
|
||||
id="use164" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g196">
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="174"
|
||||
y="23.999998"
|
||||
id="use168" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="179.00537"
|
||||
y="23.999998"
|
||||
id="use170" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="184.01073"
|
||||
y="23.999998"
|
||||
id="use172" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="186.51123"
|
||||
y="23.999998"
|
||||
id="use174" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="191.51659"
|
||||
y="23.999998"
|
||||
id="use176" />
|
||||
<use
|
||||
xlink:href="#glyph-1-11"
|
||||
x="194.01707"
|
||||
y="23.999998"
|
||||
id="use178" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="199.02245"
|
||||
y="23.999998"
|
||||
id="use180" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="201.52293"
|
||||
y="23.999998"
|
||||
id="use182" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="206.52831"
|
||||
y="23.999998"
|
||||
id="use184" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="211.53368"
|
||||
y="23.999998"
|
||||
id="use186" />
|
||||
<use
|
||||
xlink:href="#glyph-1-12"
|
||||
x="216.53905"
|
||||
y="23.999998"
|
||||
id="use188" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="219.53612"
|
||||
y="23.999998"
|
||||
id="use190" />
|
||||
<use
|
||||
xlink:href="#glyph-1-11"
|
||||
x="224.54149"
|
||||
y="23.999998"
|
||||
id="use192" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="229.54686"
|
||||
y="23.999998"
|
||||
id="use194" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g220">
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="60.726559"
|
||||
y="62.249996"
|
||||
id="use198" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="65.731934"
|
||||
y="62.249996"
|
||||
id="use200" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="70.737305"
|
||||
y="62.249996"
|
||||
id="use202" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="73.237793"
|
||||
y="62.249996"
|
||||
id="use204" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="78.243164"
|
||||
y="62.249996"
|
||||
id="use206" />
|
||||
<use
|
||||
xlink:href="#glyph-1-11"
|
||||
x="80.743652"
|
||||
y="62.249996"
|
||||
id="use208" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="85.749023"
|
||||
y="62.249996"
|
||||
id="use210" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="88.249512"
|
||||
y="62.249996"
|
||||
id="use212" />
|
||||
<use
|
||||
xlink:href="#glyph-1-13"
|
||||
x="93.254883"
|
||||
y="62.249996"
|
||||
id="use214" />
|
||||
<use
|
||||
xlink:href="#glyph-1-11"
|
||||
x="95.755363"
|
||||
y="62.249996"
|
||||
id="use216" />
|
||||
<use
|
||||
xlink:href="#glyph-1-14"
|
||||
x="100.76073"
|
||||
y="62.249996"
|
||||
id="use218" />
|
||||
</g>
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 182.000008 90.500004 L 182.000008 50.500002 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path222" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g228">
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="138.73828"
|
||||
y="49.499996"
|
||||
id="use224" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="141.23877"
|
||||
y="49.499996"
|
||||
id="use226" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 29 KiB |
@@ -0,0 +1,294 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="145.919998pt"
|
||||
height="73.919998pt"
|
||||
viewBox="0 0 145.919998 73.919998"
|
||||
version="1.1"
|
||||
id="svg119"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs55">
|
||||
<g
|
||||
id="g53">
|
||||
<g
|
||||
id="glyph-0-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.640625 L 5.640625 -5.640625 L 5.640625 0 Z M 1.265625 -0.140625 L 5.5 -0.140625 L 5.5 -5.5 L 1.265625 -5.5 Z M 1.265625 -0.140625 "
|
||||
id="path2" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-1">
|
||||
<path
|
||||
d="M 3.359375 -1.484375 L 4.59375 -1.28125 C 4.4375 -0.832031 4.1875 -0.488281 3.84375 -0.25 C 3.5 -0.0078125 3.070313 0.109375 2.5625 0.109375 C 1.75 0.109375 1.144531 -0.15625 0.75 -0.6875 C 0.4375 -1.113281 0.28125 -1.65625 0.28125 -2.3125 C 0.28125 -3.082031 0.484375 -3.6875 0.890625 -4.125 C 1.296875 -4.5625 1.8125 -4.78125 2.4375 -4.78125 C 3.132813 -4.78125 3.679688 -4.550781 4.078125 -4.09375 C 4.484375 -3.632813 4.675781 -2.929688 4.65625 -1.984375 L 1.5625 -1.984375 C 1.5625 -1.617188 1.65625 -1.332031 1.84375 -1.125 C 2.039063 -0.914063 2.285156 -0.8125 2.578125 -0.8125 C 2.765625 -0.8125 2.925781 -0.863281 3.0625 -0.96875 C 3.195313 -1.082031 3.296875 -1.253906 3.359375 -1.484375 Z M 3.4375 -2.75 C 3.425781 -3.101563 3.332031 -3.375 3.15625 -3.5625 C 2.976563 -3.75 2.765625 -3.84375 2.515625 -3.84375 C 2.242188 -3.84375 2.019531 -3.742188 1.84375 -3.546875 C 1.664063 -3.347656 1.578125 -3.082031 1.578125 -2.75 Z M 3.4375 -2.75 "
|
||||
id="path5" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-2">
|
||||
<path
|
||||
d="M 0.046875 0 L 1.734375 -2.40625 L 0.125 -4.6875 L 1.640625 -4.6875 L 2.46875 -3.390625 L 3.34375 -4.6875 L 4.796875 -4.6875 L 3.203125 -2.46875 L 4.9375 0 L 3.421875 0 L 2.46875 -1.453125 L 1.5 0 Z M 0.046875 0 "
|
||||
id="path8" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-3">
|
||||
<path
|
||||
d="M 1.578125 -3.25 L 0.453125 -3.453125 C 0.578125 -3.910156 0.789063 -4.242188 1.09375 -4.453125 C 1.40625 -4.671875 1.867188 -4.78125 2.484375 -4.78125 C 3.035156 -4.78125 3.445313 -4.710938 3.71875 -4.578125 C 3.988281 -4.453125 4.175781 -4.289063 4.28125 -4.09375 C 4.394531 -3.894531 4.453125 -3.523438 4.453125 -2.984375 L 4.4375 -1.53125 C 4.4375 -1.125 4.457031 -0.820313 4.5 -0.625 C 4.539063 -0.425781 4.613281 -0.21875 4.71875 0 L 3.5 0 C 3.457031 -0.0820313 3.414063 -0.203125 3.375 -0.359375 C 3.351563 -0.429688 3.335938 -0.484375 3.328125 -0.515625 C 3.117188 -0.304688 2.890625 -0.148438 2.640625 -0.046875 C 2.398438 0.0546875 2.144531 0.109375 1.875 0.109375 C 1.394531 0.109375 1.015625 -0.0195313 0.734375 -0.28125 C 0.460938 -0.539063 0.328125 -0.875 0.328125 -1.28125 C 0.328125 -1.539063 0.390625 -1.773438 0.515625 -1.984375 C 0.640625 -2.191406 0.816406 -2.347656 1.046875 -2.453125 C 1.273438 -2.566406 1.601563 -2.664063 2.03125 -2.75 C 2.601563 -2.863281 3.003906 -2.96875 3.234375 -3.0625 L 3.234375 -3.171875 C 3.234375 -3.410156 3.171875 -3.582031 3.046875 -3.6875 C 2.929688 -3.789063 2.710938 -3.84375 2.390625 -3.84375 C 2.171875 -3.84375 2 -3.796875 1.875 -3.703125 C 1.75 -3.617188 1.648438 -3.46875 1.578125 -3.25 Z M 3.234375 -2.25 C 3.078125 -2.195313 2.828125 -2.132813 2.484375 -2.0625 C 2.140625 -1.988281 1.910156 -1.914063 1.796875 -1.84375 C 1.640625 -1.726563 1.5625 -1.582031 1.5625 -1.40625 C 1.5625 -1.226563 1.625 -1.078125 1.75 -0.953125 C 1.882813 -0.828125 2.050781 -0.765625 2.25 -0.765625 C 2.46875 -0.765625 2.679688 -0.835938 2.890625 -0.984375 C 3.035156 -1.097656 3.132813 -1.234375 3.1875 -1.390625 C 3.21875 -1.503906 3.234375 -1.707031 3.234375 -2 Z M 3.234375 -2.25 "
|
||||
id="path11" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-4">
|
||||
<path
|
||||
d="M 0.5625 -4.6875 L 1.703125 -4.6875 L 1.703125 -4.046875 C 2.109375 -4.535156 2.59375 -4.78125 3.15625 -4.78125 C 3.457031 -4.78125 3.71875 -4.71875 3.9375 -4.59375 C 4.15625 -4.476563 4.335938 -4.296875 4.484375 -4.046875 C 4.679688 -4.296875 4.898438 -4.476563 5.140625 -4.59375 C 5.378906 -4.71875 5.632813 -4.78125 5.90625 -4.78125 C 6.25 -4.78125 6.539063 -4.710938 6.78125 -4.578125 C 7.019531 -4.441406 7.195313 -4.238281 7.3125 -3.96875 C 7.394531 -3.769531 7.4375 -3.445313 7.4375 -3 L 7.4375 0 L 6.203125 0 L 6.203125 -2.671875 C 6.203125 -3.140625 6.160156 -3.441406 6.078125 -3.578125 C 5.960938 -3.753906 5.785156 -3.84375 5.546875 -3.84375 C 5.367188 -3.84375 5.203125 -3.785156 5.046875 -3.671875 C 4.898438 -3.566406 4.789063 -3.410156 4.71875 -3.203125 C 4.65625 -3.003906 4.625 -2.6875 4.625 -2.25 L 4.625 0 L 3.390625 0 L 3.390625 -2.5625 C 3.390625 -3.019531 3.363281 -3.3125 3.3125 -3.4375 C 3.269531 -3.570313 3.203125 -3.671875 3.109375 -3.734375 C 3.023438 -3.804688 2.898438 -3.84375 2.734375 -3.84375 C 2.546875 -3.84375 2.375 -3.789063 2.21875 -3.6875 C 2.070313 -3.582031 1.960938 -3.429688 1.890625 -3.234375 C 1.828125 -3.046875 1.796875 -2.726563 1.796875 -2.28125 L 1.796875 0 L 0.5625 0 Z M 0.5625 -4.6875 "
|
||||
id="path14" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-5">
|
||||
<path
|
||||
d="M 0.609375 -4.6875 L 1.765625 -4.6875 L 1.765625 -4 C 1.921875 -4.226563 2.125 -4.414063 2.375 -4.5625 C 2.632813 -4.707031 2.921875 -4.78125 3.234375 -4.78125 C 3.773438 -4.78125 4.234375 -4.566406 4.609375 -4.140625 C 4.992188 -3.722656 5.1875 -3.132813 5.1875 -2.375 C 5.1875 -1.582031 4.992188 -0.96875 4.609375 -0.53125 C 4.222656 -0.101563 3.757813 0.109375 3.21875 0.109375 C 2.957031 0.109375 2.722656 0.0546875 2.515625 -0.046875 C 2.304688 -0.148438 2.085938 -0.328125 1.859375 -0.578125 L 1.859375 1.78125 L 0.609375 1.78125 Z M 1.84375 -2.421875 C 1.84375 -1.890625 1.945313 -1.5 2.15625 -1.25 C 2.363281 -1 2.617188 -0.875 2.921875 -0.875 C 3.203125 -0.875 3.4375 -0.988281 3.625 -1.21875 C 3.820313 -1.445313 3.921875 -1.828125 3.921875 -2.359375 C 3.921875 -2.847656 3.820313 -3.210938 3.625 -3.453125 C 3.425781 -3.691406 3.179688 -3.8125 2.890625 -3.8125 C 2.585938 -3.8125 2.335938 -3.691406 2.140625 -3.453125 C 1.941406 -3.222656 1.84375 -2.878906 1.84375 -2.421875 Z M 1.84375 -2.421875 "
|
||||
id="path17" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-6">
|
||||
<path
|
||||
d="M 0.640625 0 L 0.640625 -6.46875 L 1.890625 -6.46875 L 1.890625 0 Z M 0.640625 0 "
|
||||
id="path20" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.640625 L 5.640625 -5.640625 L 5.640625 0 Z M 1.265625 -0.140625 L 5.5 -0.140625 L 5.5 -5.5 L 1.265625 -5.5 Z M 1.265625 -0.140625 "
|
||||
id="path23" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-1">
|
||||
<path
|
||||
d="M 3.796875 -1.515625 L 4.625 -1.40625 C 4.488281 -0.925781 4.242188 -0.550781 3.890625 -0.28125 C 3.546875 -0.0195313 3.101563 0.109375 2.5625 0.109375 C 1.875 0.109375 1.328125 -0.0976563 0.921875 -0.515625 C 0.523438 -0.941406 0.328125 -1.535156 0.328125 -2.296875 C 0.328125 -3.085938 0.53125 -3.695313 0.9375 -4.125 C 1.34375 -4.5625 1.867188 -4.78125 2.515625 -4.78125 C 3.140625 -4.78125 3.648438 -4.566406 4.046875 -4.140625 C 4.441406 -3.722656 4.640625 -3.125 4.640625 -2.34375 C 4.640625 -2.300781 4.640625 -2.234375 4.640625 -2.140625 L 1.15625 -2.140625 C 1.175781 -1.617188 1.316406 -1.222656 1.578125 -0.953125 C 1.847656 -0.679688 2.175781 -0.546875 2.5625 -0.546875 C 2.851563 -0.546875 3.101563 -0.617188 3.3125 -0.765625 C 3.519531 -0.921875 3.679688 -1.171875 3.796875 -1.515625 Z M 1.1875 -2.796875 L 3.8125 -2.796875 C 3.769531 -3.179688 3.671875 -3.472656 3.515625 -3.671875 C 3.253906 -3.984375 2.925781 -4.140625 2.53125 -4.140625 C 2.164063 -4.140625 1.859375 -4.015625 1.609375 -3.765625 C 1.359375 -3.523438 1.21875 -3.203125 1.1875 -2.796875 Z M 1.1875 -2.796875 "
|
||||
id="path26" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-2">
|
||||
<path
|
||||
d="M 2.328125 -0.703125 L 2.4375 -0.015625 C 2.21875 0.0351563 2.019531 0.0625 1.84375 0.0625 C 1.550781 0.0625 1.328125 0.015625 1.171875 -0.078125 C 1.015625 -0.171875 0.898438 -0.289063 0.828125 -0.4375 C 0.765625 -0.582031 0.734375 -0.894531 0.734375 -1.375 L 0.734375 -4.0625 L 0.15625 -4.0625 L 0.15625 -4.6875 L 0.734375 -4.6875 L 0.734375 -5.84375 L 1.53125 -6.3125 L 1.53125 -4.6875 L 2.328125 -4.6875 L 2.328125 -4.0625 L 1.53125 -4.0625 L 1.53125 -1.328125 C 1.53125 -1.097656 1.539063 -0.953125 1.5625 -0.890625 C 1.59375 -0.828125 1.640625 -0.773438 1.703125 -0.734375 C 1.765625 -0.691406 1.859375 -0.671875 1.984375 -0.671875 C 2.066406 -0.671875 2.179688 -0.679688 2.328125 -0.703125 Z M 2.328125 -0.703125 "
|
||||
id="path29" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-3">
|
||||
<path
|
||||
d="M 0.59375 0 L 0.59375 -6.46875 L 1.390625 -6.46875 L 1.390625 -4.140625 C 1.753906 -4.566406 2.222656 -4.78125 2.796875 -4.78125 C 3.140625 -4.78125 3.4375 -4.710938 3.6875 -4.578125 C 3.945313 -4.441406 4.128906 -4.253906 4.234375 -4.015625 C 4.347656 -3.773438 4.40625 -3.425781 4.40625 -2.96875 L 4.40625 0 L 3.609375 0 L 3.609375 -2.96875 C 3.609375 -3.363281 3.519531 -3.648438 3.34375 -3.828125 C 3.175781 -4.015625 2.9375 -4.109375 2.625 -4.109375 C 2.394531 -4.109375 2.175781 -4.046875 1.96875 -3.921875 C 1.757813 -3.796875 1.609375 -3.628906 1.515625 -3.421875 C 1.429688 -3.210938 1.390625 -2.925781 1.390625 -2.5625 L 1.390625 0 Z M 0.59375 0 "
|
||||
id="path32" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-4">
|
||||
<path
|
||||
d="M 0.375 -3.1875 C 0.375 -3.945313 0.453125 -4.5625 0.609375 -5.03125 C 0.765625 -5.5 1 -5.859375 1.3125 -6.109375 C 1.625 -6.359375 2.015625 -6.484375 2.484375 -6.484375 C 2.828125 -6.484375 3.128906 -6.414063 3.390625 -6.28125 C 3.648438 -6.144531 3.863281 -5.941406 4.03125 -5.671875 C 4.207031 -5.410156 4.34375 -5.09375 4.4375 -4.71875 C 4.539063 -4.34375 4.59375 -3.832031 4.59375 -3.1875 C 4.59375 -2.425781 4.515625 -1.8125 4.359375 -1.34375 C 4.203125 -0.882813 3.96875 -0.523438 3.65625 -0.265625 C 3.34375 -0.015625 2.953125 0.109375 2.484375 0.109375 C 1.859375 0.109375 1.367188 -0.113281 1.015625 -0.5625 C 0.585938 -1.09375 0.375 -1.96875 0.375 -3.1875 Z M 1.1875 -3.1875 C 1.1875 -2.125 1.3125 -1.414063 1.5625 -1.0625 C 1.8125 -0.71875 2.117188 -0.546875 2.484375 -0.546875 C 2.847656 -0.546875 3.15625 -0.71875 3.40625 -1.0625 C 3.65625 -1.414063 3.78125 -2.125 3.78125 -3.1875 C 3.78125 -4.25 3.65625 -4.953125 3.40625 -5.296875 C 3.15625 -5.648438 2.84375 -5.828125 2.46875 -5.828125 C 2.101563 -5.828125 1.8125 -5.675781 1.59375 -5.375 C 1.320313 -4.976563 1.1875 -4.25 1.1875 -3.1875 Z M 1.1875 -3.1875 "
|
||||
id="path35" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-5">
|
||||
<path
|
||||
d="M 3.359375 0 L 2.578125 0 L 2.578125 -5.0625 C 2.378906 -4.875 2.125 -4.6875 1.8125 -4.5 C 1.507813 -4.320313 1.234375 -4.1875 0.984375 -4.09375 L 0.984375 -4.875 C 1.429688 -5.082031 1.816406 -5.332031 2.140625 -5.625 C 2.472656 -5.925781 2.710938 -6.210938 2.859375 -6.484375 L 3.359375 -6.484375 Z M 3.359375 0 "
|
||||
id="path38" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-6">
|
||||
<path
|
||||
d="M 0.8125 0 L 0.8125 -0.90625 L 1.71875 -0.90625 L 1.71875 0 Z M 0.8125 0 "
|
||||
id="path41" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-7">
|
||||
<path
|
||||
d="M 0 0.109375 L 1.875 -6.578125 L 2.515625 -6.578125 L 0.640625 0.109375 Z M 0 0.109375 "
|
||||
id="path44" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-8">
|
||||
<path
|
||||
d="M 4.546875 -0.765625 L 4.546875 0 L 0.265625 0 C 0.265625 -0.1875 0.296875 -0.367188 0.359375 -0.546875 C 0.472656 -0.835938 0.648438 -1.125 0.890625 -1.40625 C 1.128906 -1.6875 1.472656 -2.015625 1.921875 -2.390625 C 2.628906 -2.960938 3.101563 -3.414063 3.34375 -3.75 C 3.59375 -4.09375 3.71875 -4.414063 3.71875 -4.71875 C 3.71875 -5.03125 3.601563 -5.289063 3.375 -5.5 C 3.15625 -5.71875 2.863281 -5.828125 2.5 -5.828125 C 2.125 -5.828125 1.820313 -5.710938 1.59375 -5.484375 C 1.363281 -5.253906 1.242188 -4.9375 1.234375 -4.53125 L 0.421875 -4.625 C 0.472656 -5.226563 0.679688 -5.6875 1.046875 -6 C 1.410156 -6.320313 1.898438 -6.484375 2.515625 -6.484375 C 3.140625 -6.484375 3.628906 -6.3125 3.984375 -5.96875 C 4.347656 -5.625 4.53125 -5.203125 4.53125 -4.703125 C 4.53125 -4.441406 4.476563 -4.1875 4.375 -3.9375 C 4.269531 -3.6875 4.09375 -3.421875 3.84375 -3.140625 C 3.601563 -2.867188 3.195313 -2.488281 2.625 -2 C 2.144531 -1.601563 1.835938 -1.332031 1.703125 -1.1875 C 1.578125 -1.050781 1.46875 -0.910156 1.375 -0.765625 Z M 4.546875 -0.765625 "
|
||||
id="path47" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-9">
|
||||
<path
|
||||
d="M 2.921875 0 L 2.921875 -1.546875 L 0.109375 -1.546875 L 0.109375 -2.28125 L 3.0625 -6.46875 L 3.71875 -6.46875 L 3.71875 -2.28125 L 4.59375 -2.28125 L 4.59375 -1.546875 L 3.71875 -1.546875 L 3.71875 0 Z M 2.921875 -2.28125 L 2.921875 -5.1875 L 0.890625 -2.28125 Z M 2.921875 -2.28125 "
|
||||
id="path50" />
|
||||
</g>
|
||||
</g>
|
||||
</defs>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(100%, 94.898987%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(83.918762%, 71.369934%, 33.729553%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 1.000054 1.000054 L 81.001187 1.000054 L 81.001187 51.000113 L 1.000054 51.000113 Z M 1.000054 1.000054 "
|
||||
transform="matrix(0.752577, 0, 0, 0.752577, 0.376289, 0.376289)"
|
||||
id="path57" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g73">
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="12.782054"
|
||||
y="18.81443"
|
||||
id="use59" />
|
||||
<use
|
||||
xlink:href="#glyph-0-2"
|
||||
x="17.804625"
|
||||
y="18.81443"
|
||||
id="use61" />
|
||||
<use
|
||||
xlink:href="#glyph-0-3"
|
||||
x="22.827196"
|
||||
y="18.81443"
|
||||
id="use63" />
|
||||
<use
|
||||
xlink:href="#glyph-0-4"
|
||||
x="27.849768"
|
||||
y="18.81443"
|
||||
id="use65" />
|
||||
<use
|
||||
xlink:href="#glyph-0-5"
|
||||
x="35.879707"
|
||||
y="18.81443"
|
||||
id="use67" />
|
||||
<use
|
||||
xlink:href="#glyph-0-6"
|
||||
x="41.396156"
|
||||
y="18.81443"
|
||||
id="use69" />
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="43.905239"
|
||||
y="18.81443"
|
||||
id="use71" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g83">
|
||||
<use
|
||||
xlink:href="#glyph-1-1"
|
||||
x="21.307343"
|
||||
y="33.865974"
|
||||
id="use75" />
|
||||
<use
|
||||
xlink:href="#glyph-1-2"
|
||||
x="26.329914"
|
||||
y="33.865974"
|
||||
id="use77" />
|
||||
<use
|
||||
xlink:href="#glyph-1-3"
|
||||
x="28.838995"
|
||||
y="33.865974"
|
||||
id="use79" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="33.861565"
|
||||
y="33.865974"
|
||||
id="use81" />
|
||||
</g>
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 40.998025 90.998084 L 40.998025 51.000113 "
|
||||
transform="matrix(0.752577, 0, 0, 0.752577, 0.376289, 0.376289)"
|
||||
id="path85" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 1.000054 90.998084 L 190.998203 90.998084 "
|
||||
transform="matrix(0.752577, 0, 0, 0.752577, 0.376289, 0.376289)"
|
||||
id="path87" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g111">
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="66.955856"
|
||||
y="62.463909"
|
||||
id="use89" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="71.978424"
|
||||
y="62.463909"
|
||||
id="use91" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="77.000999"
|
||||
y="62.463909"
|
||||
id="use93" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="79.510078"
|
||||
y="62.463909"
|
||||
id="use95" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="84.532654"
|
||||
y="62.463909"
|
||||
id="use97" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="87.041733"
|
||||
y="62.463909"
|
||||
id="use99" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="92.064301"
|
||||
y="62.463909"
|
||||
id="use101" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="94.57338"
|
||||
y="62.463909"
|
||||
id="use103" />
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="99.595955"
|
||||
y="62.463909"
|
||||
id="use105" />
|
||||
<use
|
||||
xlink:href="#glyph-1-8"
|
||||
x="102.10503"
|
||||
y="62.463909"
|
||||
id="use107" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="107.1276"
|
||||
y="62.463909"
|
||||
id="use109" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g117">
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="18.802671"
|
||||
y="48.917519"
|
||||
id="use113" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="21.311752"
|
||||
y="48.917519"
|
||||
id="use115" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1,507 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="168pt"
|
||||
height="71.040001pt"
|
||||
viewBox="0 0 168 71.040001"
|
||||
version="1.1"
|
||||
id="svg207"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs97">
|
||||
<g
|
||||
id="g92">
|
||||
<g
|
||||
id="glyph-0-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.625 L 5.625 -5.625 L 5.625 0 Z M 1.265625 -0.140625 L 5.484375 -0.140625 L 5.484375 -5.484375 L 1.265625 -5.484375 Z M 1.265625 -0.140625 "
|
||||
id="path2" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-1">
|
||||
<path
|
||||
d="M 3.34375 -1.484375 L 4.578125 -1.28125 C 4.421875 -0.832031 4.171875 -0.488281 3.828125 -0.25 C 3.484375 -0.0078125 3.054688 0.109375 2.546875 0.109375 C 1.734375 0.109375 1.132813 -0.15625 0.75 -0.6875 C 0.4375 -1.113281 0.28125 -1.648438 0.28125 -2.296875 C 0.28125 -3.066406 0.484375 -3.671875 0.890625 -4.109375 C 1.296875 -4.546875 1.804688 -4.765625 2.421875 -4.765625 C 3.117188 -4.765625 3.664063 -4.535156 4.0625 -4.078125 C 4.46875 -3.617188 4.660156 -2.921875 4.640625 -1.984375 L 1.546875 -1.984375 C 1.554688 -1.609375 1.65625 -1.316406 1.84375 -1.109375 C 2.039063 -0.910156 2.28125 -0.8125 2.5625 -0.8125 C 2.757813 -0.8125 2.921875 -0.863281 3.046875 -0.96875 C 3.179688 -1.082031 3.28125 -1.253906 3.34375 -1.484375 Z M 3.421875 -2.734375 C 3.410156 -3.085938 3.316406 -3.359375 3.140625 -3.546875 C 2.960938 -3.734375 2.75 -3.828125 2.5 -3.828125 C 2.226563 -3.828125 2.003906 -3.726563 1.828125 -3.53125 C 1.648438 -3.332031 1.566406 -3.066406 1.578125 -2.734375 Z M 3.421875 -2.734375 "
|
||||
id="path5" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-2">
|
||||
<path
|
||||
d="M 0.046875 0 L 1.734375 -2.40625 L 0.125 -4.671875 L 1.625 -4.671875 L 2.453125 -3.390625 L 3.328125 -4.671875 L 4.78125 -4.671875 L 3.1875 -2.453125 L 4.921875 0 L 3.40625 0 L 2.453125 -1.453125 L 1.5 0 Z M 0.046875 0 "
|
||||
id="path8" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-3">
|
||||
<path
|
||||
d="M 1.5625 -3.25 L 0.453125 -3.453125 C 0.578125 -3.898438 0.789063 -4.226563 1.09375 -4.4375 C 1.40625 -4.65625 1.863281 -4.765625 2.46875 -4.765625 C 3.019531 -4.765625 3.429688 -4.695313 3.703125 -4.5625 C 3.972656 -4.4375 4.160156 -4.273438 4.265625 -4.078125 C 4.378906 -3.878906 4.4375 -3.507813 4.4375 -2.96875 L 4.421875 -1.53125 C 4.421875 -1.125 4.441406 -0.820313 4.484375 -0.625 C 4.523438 -0.425781 4.597656 -0.21875 4.703125 0 L 3.484375 0 C 3.453125 -0.0820313 3.410156 -0.203125 3.359375 -0.359375 C 3.335938 -0.429688 3.320313 -0.484375 3.3125 -0.515625 C 3.101563 -0.304688 2.878906 -0.148438 2.640625 -0.046875 C 2.398438 0.0546875 2.144531 0.109375 1.875 0.109375 C 1.394531 0.109375 1.015625 -0.0195313 0.734375 -0.28125 C 0.460938 -0.539063 0.328125 -0.875 0.328125 -1.28125 C 0.328125 -1.539063 0.390625 -1.773438 0.515625 -1.984375 C 0.640625 -2.191406 0.8125 -2.347656 1.03125 -2.453125 C 1.257813 -2.566406 1.585938 -2.664063 2.015625 -2.75 C 2.597656 -2.851563 3 -2.953125 3.21875 -3.046875 L 3.21875 -3.171875 C 3.21875 -3.410156 3.160156 -3.578125 3.046875 -3.671875 C 2.929688 -3.773438 2.707031 -3.828125 2.375 -3.828125 C 2.15625 -3.828125 1.984375 -3.78125 1.859375 -3.6875 C 1.742188 -3.601563 1.644531 -3.457031 1.5625 -3.25 Z M 3.21875 -2.234375 C 3.0625 -2.179688 2.8125 -2.117188 2.46875 -2.046875 C 2.125 -1.972656 1.898438 -1.90625 1.796875 -1.84375 C 1.640625 -1.726563 1.5625 -1.582031 1.5625 -1.40625 C 1.5625 -1.226563 1.625 -1.078125 1.75 -0.953125 C 1.875 -0.828125 2.035156 -0.765625 2.234375 -0.765625 C 2.460938 -0.765625 2.675781 -0.835938 2.875 -0.984375 C 3.03125 -1.097656 3.128906 -1.234375 3.171875 -1.390625 C 3.203125 -1.492188 3.21875 -1.695313 3.21875 -2 Z M 3.21875 -2.234375 "
|
||||
id="path11" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-4">
|
||||
<path
|
||||
d="M 0.546875 -4.671875 L 1.6875 -4.671875 L 1.6875 -4.03125 C 2.09375 -4.519531 2.578125 -4.765625 3.140625 -4.765625 C 3.441406 -4.765625 3.703125 -4.703125 3.921875 -4.578125 C 4.140625 -4.460938 4.320313 -4.28125 4.46875 -4.03125 C 4.664063 -4.28125 4.882813 -4.460938 5.125 -4.578125 C 5.363281 -4.703125 5.617188 -4.765625 5.890625 -4.765625 C 6.234375 -4.765625 6.519531 -4.695313 6.75 -4.5625 C 6.988281 -4.425781 7.171875 -4.222656 7.296875 -3.953125 C 7.378906 -3.753906 7.421875 -3.429688 7.421875 -2.984375 L 7.421875 0 L 6.1875 0 L 6.1875 -2.671875 C 6.1875 -3.128906 6.144531 -3.425781 6.0625 -3.5625 C 5.945313 -3.738281 5.769531 -3.828125 5.53125 -3.828125 C 5.351563 -3.828125 5.1875 -3.773438 5.03125 -3.671875 C 4.882813 -3.566406 4.773438 -3.410156 4.703125 -3.203125 C 4.640625 -3.003906 4.609375 -2.679688 4.609375 -2.234375 L 4.609375 0 L 3.375 0 L 3.375 -2.5625 C 3.375 -3.007813 3.351563 -3.300781 3.3125 -3.4375 C 3.269531 -3.570313 3.203125 -3.671875 3.109375 -3.734375 C 3.015625 -3.796875 2.890625 -3.828125 2.734375 -3.828125 C 2.535156 -3.828125 2.359375 -3.773438 2.203125 -3.671875 C 2.054688 -3.566406 1.945313 -3.414063 1.875 -3.21875 C 1.8125 -3.03125 1.78125 -2.710938 1.78125 -2.265625 L 1.78125 0 L 0.546875 0 Z M 0.546875 -4.671875 "
|
||||
id="path14" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-5">
|
||||
<path
|
||||
d="M 0.609375 -4.671875 L 1.765625 -4.671875 L 1.765625 -3.984375 C 1.910156 -4.210938 2.109375 -4.398438 2.359375 -4.546875 C 2.617188 -4.691406 2.90625 -4.765625 3.21875 -4.765625 C 3.757813 -4.765625 4.21875 -4.550781 4.59375 -4.125 C 4.96875 -3.707031 5.15625 -3.117188 5.15625 -2.359375 C 5.15625 -1.578125 4.960938 -0.96875 4.578125 -0.53125 C 4.203125 -0.101563 3.742188 0.109375 3.203125 0.109375 C 2.953125 0.109375 2.71875 0.0546875 2.5 -0.046875 C 2.289063 -0.148438 2.070313 -0.328125 1.84375 -0.578125 L 1.84375 1.78125 L 0.609375 1.78125 Z M 1.828125 -2.40625 C 1.828125 -1.882813 1.929688 -1.5 2.140625 -1.25 C 2.347656 -1 2.601563 -0.875 2.90625 -0.875 C 3.1875 -0.875 3.421875 -0.988281 3.609375 -1.21875 C 3.804688 -1.445313 3.90625 -1.820313 3.90625 -2.34375 C 3.90625 -2.832031 3.804688 -3.195313 3.609375 -3.4375 C 3.410156 -3.675781 3.171875 -3.796875 2.890625 -3.796875 C 2.585938 -3.796875 2.332031 -3.675781 2.125 -3.4375 C 1.925781 -3.207031 1.828125 -2.863281 1.828125 -2.40625 Z M 1.828125 -2.40625 "
|
||||
id="path17" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-6">
|
||||
<path
|
||||
d="M 0.640625 0 L 0.640625 -6.4375 L 1.875 -6.4375 L 1.875 0 Z M 0.640625 0 "
|
||||
id="path20" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-7">
|
||||
<path
|
||||
d="M 0.609375 0 L 0.609375 -6.4375 L 1.921875 -6.4375 L 1.921875 0 Z M 0.609375 0 "
|
||||
id="path23" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-8">
|
||||
<path
|
||||
d="M 0.65625 0 L 0.65625 -6.4375 L 2.75 -6.4375 C 3.53125 -6.4375 4.046875 -6.40625 4.296875 -6.34375 C 4.660156 -6.25 4.96875 -6.039063 5.21875 -5.71875 C 5.46875 -5.394531 5.59375 -4.972656 5.59375 -4.453125 C 5.59375 -4.066406 5.519531 -3.738281 5.375 -3.46875 C 5.226563 -3.195313 5.046875 -2.984375 4.828125 -2.828125 C 4.609375 -2.671875 4.382813 -2.566406 4.15625 -2.515625 C 3.84375 -2.460938 3.390625 -2.4375 2.796875 -2.4375 L 1.953125 -2.4375 L 1.953125 0 Z M 1.953125 -5.359375 L 1.953125 -3.53125 L 2.671875 -3.53125 C 3.179688 -3.53125 3.519531 -3.5625 3.6875 -3.625 C 3.863281 -3.695313 4 -3.800781 4.09375 -3.9375 C 4.195313 -4.082031 4.25 -4.25 4.25 -4.4375 C 4.25 -4.675781 4.179688 -4.867188 4.046875 -5.015625 C 3.910156 -5.171875 3.734375 -5.269531 3.515625 -5.3125 C 3.359375 -5.34375 3.046875 -5.359375 2.578125 -5.359375 Z M 1.953125 -5.359375 "
|
||||
id="path26" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-9">
|
||||
<path
|
||||
d="M 1.921875 0 L 0.046875 -4.671875 L 1.34375 -4.671875 L 2.21875 -2.28125 L 2.484375 -1.484375 C 2.546875 -1.691406 2.585938 -1.828125 2.609375 -1.890625 C 2.648438 -2.023438 2.691406 -2.15625 2.734375 -2.28125 L 3.625 -4.671875 L 4.890625 -4.671875 L 3.046875 0 Z M 1.921875 0 "
|
||||
id="path29" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-10">
|
||||
<path
|
||||
d="M 4.5625 -4.859375 L 3.375 -4.734375 C 3.34375 -4.984375 3.265625 -5.164063 3.140625 -5.28125 C 3.015625 -5.394531 2.851563 -5.453125 2.65625 -5.453125 C 2.394531 -5.453125 2.175781 -5.332031 2 -5.09375 C 1.820313 -4.863281 1.707031 -4.378906 1.65625 -3.640625 C 1.96875 -4.003906 2.351563 -4.1875 2.8125 -4.1875 C 3.320313 -4.1875 3.757813 -3.988281 4.125 -3.59375 C 4.5 -3.195313 4.6875 -2.691406 4.6875 -2.078125 C 4.6875 -1.410156 4.492188 -0.878906 4.109375 -0.484375 C 3.722656 -0.0859375 3.222656 0.109375 2.609375 0.109375 C 1.960938 0.109375 1.425781 -0.140625 1 -0.640625 C 0.582031 -1.148438 0.375 -1.984375 0.375 -3.140625 C 0.375 -4.316406 0.59375 -5.164063 1.03125 -5.6875 C 1.46875 -6.207031 2.035156 -6.46875 2.734375 -6.46875 C 3.222656 -6.46875 3.628906 -6.328125 3.953125 -6.046875 C 4.273438 -5.773438 4.476563 -5.378906 4.5625 -4.859375 Z M 1.765625 -2.171875 C 1.765625 -1.765625 1.859375 -1.453125 2.046875 -1.234375 C 2.234375 -1.023438 2.441406 -0.921875 2.671875 -0.921875 C 2.898438 -0.921875 3.085938 -1.007813 3.234375 -1.1875 C 3.390625 -1.363281 3.46875 -1.65625 3.46875 -2.0625 C 3.46875 -2.476563 3.382813 -2.785156 3.21875 -2.984375 C 3.0625 -3.179688 2.859375 -3.28125 2.609375 -3.28125 C 2.378906 -3.28125 2.179688 -3.1875 2.015625 -3 C 1.847656 -2.8125 1.765625 -2.535156 1.765625 -2.171875 Z M 1.765625 -2.171875 "
|
||||
id="path32" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-11">
|
||||
<path
|
||||
d="M 0.65625 0 L 0.65625 -6.4375 L 3.390625 -6.4375 C 4.085938 -6.4375 4.585938 -6.378906 4.890625 -6.265625 C 5.203125 -6.148438 5.453125 -5.941406 5.640625 -5.640625 C 5.828125 -5.347656 5.921875 -5.015625 5.921875 -4.640625 C 5.921875 -4.148438 5.78125 -3.75 5.5 -3.4375 C 5.21875 -3.125 4.796875 -2.925781 4.234375 -2.84375 C 4.515625 -2.675781 4.742188 -2.492188 4.921875 -2.296875 C 5.109375 -2.109375 5.359375 -1.757813 5.671875 -1.25 L 6.453125 0 L 4.890625 0 L 3.953125 -1.40625 C 3.617188 -1.90625 3.390625 -2.21875 3.265625 -2.34375 C 3.140625 -2.476563 3.007813 -2.566406 2.875 -2.609375 C 2.738281 -2.660156 2.519531 -2.6875 2.21875 -2.6875 L 1.953125 -2.6875 L 1.953125 0 Z M 1.953125 -3.71875 L 2.921875 -3.71875 C 3.546875 -3.71875 3.9375 -3.742188 4.09375 -3.796875 C 4.25 -3.847656 4.367188 -3.9375 4.453125 -4.0625 C 4.546875 -4.195313 4.59375 -4.359375 4.59375 -4.546875 C 4.59375 -4.765625 4.53125 -4.941406 4.40625 -5.078125 C 4.289063 -5.210938 4.128906 -5.296875 3.921875 -5.328125 C 3.816406 -5.347656 3.5 -5.359375 2.96875 -5.359375 L 1.953125 -5.359375 Z M 1.953125 -3.71875 "
|
||||
id="path35" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-12">
|
||||
<path
|
||||
d="M 0.359375 -2.40625 C 0.359375 -2.8125 0.457031 -3.207031 0.65625 -3.59375 C 0.863281 -3.976563 1.148438 -4.269531 1.515625 -4.46875 C 1.890625 -4.664063 2.304688 -4.765625 2.765625 -4.765625 C 3.472656 -4.765625 4.050781 -4.535156 4.5 -4.078125 C 4.945313 -3.617188 5.171875 -3.039063 5.171875 -2.34375 C 5.171875 -1.632813 4.941406 -1.046875 4.484375 -0.578125 C 4.035156 -0.117188 3.460938 0.109375 2.765625 0.109375 C 2.335938 0.109375 1.929688 0.015625 1.546875 -0.171875 C 1.160156 -0.367188 0.863281 -0.65625 0.65625 -1.03125 C 0.457031 -1.40625 0.359375 -1.863281 0.359375 -2.40625 Z M 1.625 -2.328125 C 1.625 -1.867188 1.734375 -1.515625 1.953125 -1.265625 C 2.171875 -1.023438 2.441406 -0.90625 2.765625 -0.90625 C 3.085938 -0.90625 3.359375 -1.023438 3.578125 -1.265625 C 3.796875 -1.515625 3.90625 -1.875 3.90625 -2.34375 C 3.90625 -2.800781 3.796875 -3.148438 3.578125 -3.390625 C 3.359375 -3.640625 3.085938 -3.765625 2.765625 -3.765625 C 2.441406 -3.765625 2.171875 -3.640625 1.953125 -3.390625 C 1.734375 -3.148438 1.625 -2.796875 1.625 -2.328125 Z M 1.625 -2.328125 "
|
||||
id="path38" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-13">
|
||||
<path
|
||||
d="M 3.71875 0 L 3.71875 -0.703125 C 3.550781 -0.453125 3.328125 -0.253906 3.046875 -0.109375 C 2.765625 0.0351563 2.472656 0.109375 2.171875 0.109375 C 1.859375 0.109375 1.578125 0.0390625 1.328125 -0.09375 C 1.078125 -0.238281 0.894531 -0.4375 0.78125 -0.6875 C 0.675781 -0.9375 0.625 -1.28125 0.625 -1.71875 L 0.625 -4.671875 L 1.859375 -4.671875 L 1.859375 -2.515625 C 1.859375 -1.859375 1.878906 -1.457031 1.921875 -1.3125 C 1.960938 -1.164063 2.039063 -1.046875 2.15625 -0.953125 C 2.28125 -0.867188 2.4375 -0.828125 2.625 -0.828125 C 2.832031 -0.828125 3.019531 -0.882813 3.1875 -1 C 3.363281 -1.125 3.476563 -1.269531 3.53125 -1.4375 C 3.59375 -1.613281 3.625 -2.035156 3.625 -2.703125 L 3.625 -4.671875 L 4.859375 -4.671875 L 4.859375 0 Z M 3.71875 0 "
|
||||
id="path41" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-14">
|
||||
<path
|
||||
d="M 2.78125 -4.671875 L 2.78125 -3.6875 L 1.9375 -3.6875 L 1.9375 -1.796875 C 1.9375 -1.421875 1.941406 -1.203125 1.953125 -1.140625 C 1.972656 -1.078125 2.007813 -1.023438 2.0625 -0.984375 C 2.125 -0.941406 2.195313 -0.921875 2.28125 -0.921875 C 2.394531 -0.921875 2.5625 -0.957031 2.78125 -1.03125 L 2.890625 -0.078125 C 2.597656 0.046875 2.269531 0.109375 1.90625 0.109375 C 1.6875 0.109375 1.488281 0.0703125 1.3125 0 C 1.132813 -0.0820313 1.003906 -0.179688 0.921875 -0.296875 C 0.835938 -0.410156 0.78125 -0.570313 0.75 -0.78125 C 0.71875 -0.925781 0.703125 -1.210938 0.703125 -1.640625 L 0.703125 -3.6875 L 0.140625 -3.6875 L 0.140625 -4.671875 L 0.703125 -4.671875 L 0.703125 -5.59375 L 1.9375 -6.3125 L 1.9375 -4.671875 Z M 2.78125 -4.671875 "
|
||||
id="path44" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-15">
|
||||
<path
|
||||
d="M 1.828125 0 L 0.59375 0 L 0.59375 -4.671875 L 1.734375 -4.671875 L 1.734375 -4 C 1.929688 -4.3125 2.109375 -4.515625 2.265625 -4.609375 C 2.421875 -4.710938 2.597656 -4.765625 2.796875 -4.765625 C 3.078125 -4.765625 3.347656 -4.691406 3.609375 -4.546875 L 3.234375 -3.46875 C 3.023438 -3.601563 2.832031 -3.671875 2.65625 -3.671875 C 2.476563 -3.671875 2.328125 -3.617188 2.203125 -3.515625 C 2.085938 -3.421875 1.992188 -3.25 1.921875 -3 C 1.859375 -2.75 1.828125 -2.226563 1.828125 -1.4375 Z M 1.828125 0 "
|
||||
id="path47" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.625 L 5.625 -5.625 L 5.625 0 Z M 1.265625 -0.140625 L 5.484375 -0.140625 L 5.484375 -5.484375 L 1.265625 -5.484375 Z M 1.265625 -0.140625 "
|
||||
id="path50" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-1">
|
||||
<path
|
||||
d="M 3.78125 -1.5 L 4.609375 -1.40625 C 4.472656 -0.925781 4.226563 -0.550781 3.875 -0.28125 C 3.53125 -0.0195313 3.085938 0.109375 2.546875 0.109375 C 1.867188 0.109375 1.328125 -0.0976563 0.921875 -0.515625 C 0.523438 -0.941406 0.328125 -1.535156 0.328125 -2.296875 C 0.328125 -3.078125 0.53125 -3.679688 0.9375 -4.109375 C 1.34375 -4.546875 1.867188 -4.765625 2.515625 -4.765625 C 3.140625 -4.765625 3.644531 -4.550781 4.03125 -4.125 C 4.425781 -3.707031 4.625 -3.113281 4.625 -2.34375 C 4.625 -2.289063 4.625 -2.21875 4.625 -2.125 L 1.140625 -2.125 C 1.171875 -1.613281 1.316406 -1.222656 1.578125 -0.953125 C 1.835938 -0.679688 2.164063 -0.546875 2.5625 -0.546875 C 2.851563 -0.546875 3.097656 -0.617188 3.296875 -0.765625 C 3.503906 -0.921875 3.664063 -1.164063 3.78125 -1.5 Z M 1.1875 -2.78125 L 3.796875 -2.78125 C 3.765625 -3.175781 3.664063 -3.472656 3.5 -3.671875 C 3.25 -3.972656 2.921875 -4.125 2.515625 -4.125 C 2.148438 -4.125 1.84375 -4 1.59375 -3.75 C 1.351563 -3.507813 1.21875 -3.1875 1.1875 -2.78125 Z M 1.1875 -2.78125 "
|
||||
id="path53" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-2">
|
||||
<path
|
||||
d="M 2.328125 -0.703125 L 2.4375 -0.015625 C 2.207031 0.0351563 2.007813 0.0625 1.84375 0.0625 C 1.550781 0.0625 1.328125 0.015625 1.171875 -0.078125 C 1.015625 -0.171875 0.898438 -0.289063 0.828125 -0.4375 C 0.765625 -0.582031 0.734375 -0.890625 0.734375 -1.359375 L 0.734375 -4.046875 L 0.15625 -4.046875 L 0.15625 -4.671875 L 0.734375 -4.671875 L 0.734375 -5.828125 L 1.53125 -6.296875 L 1.53125 -4.671875 L 2.328125 -4.671875 L 2.328125 -4.046875 L 1.53125 -4.046875 L 1.53125 -1.328125 C 1.53125 -1.097656 1.539063 -0.953125 1.5625 -0.890625 C 1.59375 -0.828125 1.640625 -0.773438 1.703125 -0.734375 C 1.765625 -0.691406 1.851563 -0.671875 1.96875 -0.671875 C 2.0625 -0.671875 2.179688 -0.679688 2.328125 -0.703125 Z M 2.328125 -0.703125 "
|
||||
id="path56" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-3">
|
||||
<path
|
||||
d="M 0.59375 0 L 0.59375 -6.4375 L 1.390625 -6.4375 L 1.390625 -4.125 C 1.753906 -4.550781 2.21875 -4.765625 2.78125 -4.765625 C 3.125 -4.765625 3.421875 -4.695313 3.671875 -4.5625 C 3.929688 -4.425781 4.113281 -4.238281 4.21875 -4 C 4.332031 -3.757813 4.390625 -3.410156 4.390625 -2.953125 L 4.390625 0 L 3.609375 0 L 3.609375 -2.953125 C 3.609375 -3.347656 3.519531 -3.632813 3.34375 -3.8125 C 3.175781 -4 2.9375 -4.09375 2.625 -4.09375 C 2.382813 -4.09375 2.160156 -4.03125 1.953125 -3.90625 C 1.742188 -3.789063 1.597656 -3.628906 1.515625 -3.421875 C 1.429688 -3.210938 1.390625 -2.921875 1.390625 -2.546875 L 1.390625 0 Z M 0.59375 0 "
|
||||
id="path59" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-4">
|
||||
<path
|
||||
d="M 0.375 -3.171875 C 0.375 -3.929688 0.453125 -4.546875 0.609375 -5.015625 C 0.765625 -5.484375 0.992188 -5.84375 1.296875 -6.09375 C 1.609375 -6.34375 2 -6.46875 2.46875 -6.46875 C 2.820313 -6.46875 3.128906 -6.394531 3.390625 -6.25 C 3.648438 -6.113281 3.863281 -5.914063 4.03125 -5.65625 C 4.195313 -5.394531 4.328125 -5.078125 4.421875 -4.703125 C 4.523438 -4.328125 4.578125 -3.816406 4.578125 -3.171875 C 4.578125 -2.421875 4.5 -1.8125 4.34375 -1.34375 C 4.1875 -0.882813 3.953125 -0.523438 3.640625 -0.265625 C 3.335938 -0.015625 2.945313 0.109375 2.46875 0.109375 C 1.851563 0.109375 1.367188 -0.113281 1.015625 -0.5625 C 0.585938 -1.09375 0.375 -1.960938 0.375 -3.171875 Z M 1.1875 -3.171875 C 1.1875 -2.117188 1.304688 -1.414063 1.546875 -1.0625 C 1.796875 -0.71875 2.101563 -0.546875 2.46875 -0.546875 C 2.832031 -0.546875 3.140625 -0.71875 3.390625 -1.0625 C 3.640625 -1.414063 3.765625 -2.117188 3.765625 -3.171875 C 3.765625 -4.234375 3.640625 -4.9375 3.390625 -5.28125 C 3.140625 -5.632813 2.832031 -5.8125 2.46875 -5.8125 C 2.101563 -5.8125 1.8125 -5.660156 1.59375 -5.359375 C 1.320313 -4.960938 1.1875 -4.234375 1.1875 -3.171875 Z M 1.1875 -3.171875 "
|
||||
id="path62" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-5">
|
||||
<path
|
||||
d="M 0.8125 -3.765625 L 0.8125 -4.671875 L 1.71875 -4.671875 L 1.71875 -3.765625 Z M 0.8125 0 L 0.8125 -0.90625 L 1.71875 -0.90625 L 1.71875 0 Z M 0.8125 0 "
|
||||
id="path65" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-6">
|
||||
<path
|
||||
d="M 3.359375 0 L 2.5625 0 L 2.5625 -5.046875 C 2.375 -4.859375 2.125 -4.671875 1.8125 -4.484375 C 1.5 -4.304688 1.222656 -4.175781 0.984375 -4.09375 L 0.984375 -4.859375 C 1.421875 -5.054688 1.804688 -5.300781 2.140625 -5.59375 C 2.472656 -5.894531 2.707031 -6.1875 2.84375 -6.46875 L 3.359375 -6.46875 Z M 3.359375 0 "
|
||||
id="path68" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-7">
|
||||
<path
|
||||
d="M 4.53125 -0.765625 L 4.53125 0 L 0.265625 0 C 0.265625 -0.1875 0.296875 -0.367188 0.359375 -0.546875 C 0.472656 -0.835938 0.648438 -1.125 0.890625 -1.40625 C 1.128906 -1.6875 1.472656 -2.007813 1.921875 -2.375 C 2.617188 -2.957031 3.085938 -3.414063 3.328125 -3.75 C 3.578125 -4.082031 3.703125 -4.398438 3.703125 -4.703125 C 3.703125 -5.015625 3.585938 -5.273438 3.359375 -5.484375 C 3.140625 -5.703125 2.851563 -5.8125 2.5 -5.8125 C 2.113281 -5.8125 1.804688 -5.695313 1.578125 -5.46875 C 1.347656 -5.238281 1.234375 -4.921875 1.234375 -4.515625 L 0.421875 -4.609375 C 0.472656 -5.210938 0.679688 -5.671875 1.046875 -5.984375 C 1.410156 -6.304688 1.898438 -6.46875 2.515625 -6.46875 C 3.128906 -6.46875 3.613281 -6.296875 3.96875 -5.953125 C 4.332031 -5.609375 4.515625 -5.1875 4.515625 -4.6875 C 4.515625 -4.425781 4.460938 -4.171875 4.359375 -3.921875 C 4.253906 -3.671875 4.078125 -3.40625 3.828125 -3.125 C 3.585938 -2.851563 3.1875 -2.476563 2.625 -2 C 2.144531 -1.601563 1.835938 -1.332031 1.703125 -1.1875 C 1.566406 -1.039063 1.457031 -0.898438 1.375 -0.765625 Z M 4.53125 -0.765625 "
|
||||
id="path71" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-8">
|
||||
<path
|
||||
d="M 3.625 0 L 3.625 -0.59375 C 3.320313 -0.125 2.882813 0.109375 2.3125 0.109375 C 1.945313 0.109375 1.609375 0.00390625 1.296875 -0.203125 C 0.984375 -0.410156 0.738281 -0.695313 0.5625 -1.0625 C 0.394531 -1.425781 0.3125 -1.847656 0.3125 -2.328125 C 0.3125 -2.796875 0.390625 -3.21875 0.546875 -3.59375 C 0.703125 -3.976563 0.929688 -4.269531 1.234375 -4.46875 C 1.546875 -4.664063 1.894531 -4.765625 2.28125 -4.765625 C 2.5625 -4.765625 2.8125 -4.707031 3.03125 -4.59375 C 3.25 -4.476563 3.425781 -4.320313 3.5625 -4.125 L 3.5625 -6.4375 L 4.359375 -6.4375 L 4.359375 0 Z M 1.125 -2.328125 C 1.125 -1.734375 1.25 -1.285156 1.5 -0.984375 C 1.75 -0.691406 2.046875 -0.546875 2.390625 -0.546875 C 2.734375 -0.546875 3.023438 -0.6875 3.265625 -0.96875 C 3.515625 -1.25 3.640625 -1.679688 3.640625 -2.265625 C 3.640625 -2.898438 3.515625 -3.367188 3.265625 -3.671875 C 3.015625 -3.972656 2.710938 -4.125 2.359375 -4.125 C 2.003906 -4.125 1.707031 -3.976563 1.46875 -3.6875 C 1.238281 -3.394531 1.125 -2.941406 1.125 -2.328125 Z M 1.125 -2.328125 "
|
||||
id="path74" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-9">
|
||||
<path
|
||||
d="M 1.328125 0 L 0.59375 0 L 0.59375 -6.4375 L 1.375 -6.4375 L 1.375 -4.140625 C 1.707031 -4.554688 2.132813 -4.765625 2.65625 -4.765625 C 2.945313 -4.765625 3.21875 -4.707031 3.46875 -4.59375 C 3.726563 -4.476563 3.941406 -4.316406 4.109375 -4.109375 C 4.273438 -3.898438 4.40625 -3.644531 4.5 -3.34375 C 4.59375 -3.050781 4.640625 -2.738281 4.640625 -2.40625 C 4.640625 -1.601563 4.441406 -0.984375 4.046875 -0.546875 C 3.648438 -0.109375 3.175781 0.109375 2.625 0.109375 C 2.070313 0.109375 1.640625 -0.117188 1.328125 -0.578125 Z M 1.3125 -2.375 C 1.3125 -1.8125 1.390625 -1.40625 1.546875 -1.15625 C 1.796875 -0.75 2.128906 -0.546875 2.546875 -0.546875 C 2.898438 -0.546875 3.203125 -0.695313 3.453125 -1 C 3.703125 -1.300781 3.828125 -1.75 3.828125 -2.34375 C 3.828125 -2.945313 3.707031 -3.394531 3.46875 -3.6875 C 3.226563 -3.976563 2.9375 -4.125 2.59375 -4.125 C 2.238281 -4.125 1.9375 -3.972656 1.6875 -3.671875 C 1.4375 -3.367188 1.3125 -2.9375 1.3125 -2.375 Z M 1.3125 -2.375 "
|
||||
id="path77" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-10">
|
||||
<path
|
||||
d="M 1.59375 -3.5 C 1.257813 -3.613281 1.015625 -3.78125 0.859375 -4 C 0.703125 -4.226563 0.625 -4.5 0.625 -4.8125 C 0.625 -5.28125 0.789063 -5.671875 1.125 -5.984375 C 1.46875 -6.304688 1.914063 -6.46875 2.46875 -6.46875 C 3.03125 -6.46875 3.484375 -6.300781 3.828125 -5.96875 C 4.171875 -5.644531 4.34375 -5.25 4.34375 -4.78125 C 4.34375 -4.488281 4.265625 -4.226563 4.109375 -4 C 3.953125 -3.78125 3.710938 -3.613281 3.390625 -3.5 C 3.785156 -3.363281 4.085938 -3.148438 4.296875 -2.859375 C 4.503906 -2.578125 4.609375 -2.238281 4.609375 -1.84375 C 4.609375 -1.289063 4.410156 -0.828125 4.015625 -0.453125 C 3.628906 -0.078125 3.117188 0.109375 2.484375 0.109375 C 1.847656 0.109375 1.332031 -0.078125 0.9375 -0.453125 C 0.550781 -0.828125 0.359375 -1.296875 0.359375 -1.859375 C 0.359375 -2.273438 0.460938 -2.625 0.671875 -2.90625 C 0.890625 -3.195313 1.195313 -3.394531 1.59375 -3.5 Z M 1.4375 -4.828125 C 1.4375 -4.523438 1.53125 -4.273438 1.71875 -4.078125 C 1.914063 -3.890625 2.171875 -3.796875 2.484375 -3.796875 C 2.796875 -3.796875 3.046875 -3.890625 3.234375 -4.078125 C 3.429688 -4.273438 3.53125 -4.515625 3.53125 -4.796875 C 3.53125 -5.078125 3.429688 -5.316406 3.234375 -5.515625 C 3.035156 -5.710938 2.785156 -5.8125 2.484375 -5.8125 C 2.179688 -5.8125 1.929688 -5.710938 1.734375 -5.515625 C 1.535156 -5.328125 1.4375 -5.097656 1.4375 -4.828125 Z M 1.171875 -1.859375 C 1.171875 -1.628906 1.222656 -1.410156 1.328125 -1.203125 C 1.441406 -0.992188 1.601563 -0.832031 1.8125 -0.71875 C 2.019531 -0.601563 2.25 -0.546875 2.5 -0.546875 C 2.875 -0.546875 3.179688 -0.664063 3.421875 -0.90625 C 3.671875 -1.144531 3.796875 -1.453125 3.796875 -1.828125 C 3.796875 -2.210938 3.671875 -2.53125 3.421875 -2.78125 C 3.171875 -3.03125 2.851563 -3.15625 2.46875 -3.15625 C 2.09375 -3.15625 1.78125 -3.03125 1.53125 -2.78125 C 1.289063 -2.53125 1.171875 -2.222656 1.171875 -1.859375 Z M 1.171875 -1.859375 "
|
||||
id="path80" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-11">
|
||||
<path
|
||||
d="M 0 0.109375 L 1.875 -6.546875 L 2.5 -6.546875 L 0.640625 0.109375 Z M 0 0.109375 "
|
||||
id="path83" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-12">
|
||||
<path
|
||||
d="M 4.484375 -4.859375 L 3.6875 -4.796875 C 3.625 -5.109375 3.523438 -5.335938 3.390625 -5.484375 C 3.179688 -5.703125 2.921875 -5.8125 2.609375 -5.8125 C 2.347656 -5.8125 2.125 -5.742188 1.9375 -5.609375 C 1.6875 -5.421875 1.488281 -5.15625 1.34375 -4.8125 C 1.207031 -4.46875 1.132813 -3.972656 1.125 -3.328125 C 1.3125 -3.609375 1.539063 -3.816406 1.8125 -3.953125 C 2.09375 -4.097656 2.382813 -4.171875 2.6875 -4.171875 C 3.21875 -4.171875 3.664063 -3.976563 4.03125 -3.59375 C 4.40625 -3.207031 4.59375 -2.707031 4.59375 -2.09375 C 4.59375 -1.6875 4.503906 -1.304688 4.328125 -0.953125 C 4.148438 -0.609375 3.910156 -0.34375 3.609375 -0.15625 C 3.304688 0.0195313 2.960938 0.109375 2.578125 0.109375 C 1.921875 0.109375 1.382813 -0.128906 0.96875 -0.609375 C 0.550781 -1.097656 0.34375 -1.898438 0.34375 -3.015625 C 0.34375 -4.253906 0.570313 -5.160156 1.03125 -5.734375 C 1.425781 -6.222656 1.96875 -6.46875 2.65625 -6.46875 C 3.15625 -6.46875 3.566406 -6.320313 3.890625 -6.03125 C 4.210938 -5.75 4.410156 -5.359375 4.484375 -4.859375 Z M 1.25 -2.09375 C 1.25 -1.8125 1.304688 -1.546875 1.421875 -1.296875 C 1.535156 -1.054688 1.695313 -0.867188 1.90625 -0.734375 C 2.113281 -0.609375 2.332031 -0.546875 2.5625 -0.546875 C 2.894531 -0.546875 3.179688 -0.675781 3.421875 -0.9375 C 3.660156 -1.207031 3.78125 -1.578125 3.78125 -2.046875 C 3.78125 -2.492188 3.660156 -2.84375 3.421875 -3.09375 C 3.191406 -3.351563 2.894531 -3.484375 2.53125 -3.484375 C 2.175781 -3.484375 1.875 -3.351563 1.625 -3.09375 C 1.375 -2.84375 1.25 -2.507813 1.25 -2.09375 Z M 1.25 -2.09375 "
|
||||
id="path86" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-13">
|
||||
<path
|
||||
d="M 2.90625 0 L 2.90625 -1.546875 L 0.109375 -1.546875 L 0.109375 -2.265625 L 3.046875 -6.4375 L 3.703125 -6.4375 L 3.703125 -2.265625 L 4.578125 -2.265625 L 4.578125 -1.546875 L 3.703125 -1.546875 L 3.703125 0 Z M 2.90625 -2.265625 L 2.90625 -5.171875 L 0.890625 -2.265625 Z M 2.90625 -2.265625 "
|
||||
id="path89" />
|
||||
</g>
|
||||
</g>
|
||||
<clipPath
|
||||
id="clip-0">
|
||||
<path
|
||||
clip-rule="nonzero"
|
||||
d="M 0 56 L 168 56 L 168 69.75 L 0 69.75 Z M 0 56 "
|
||||
id="path94" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(100%, 94.898987%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(83.918762%, 71.369934%, 33.729553%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 1 0.5 L 81.000003 0.5 L 81.000003 49.000002 L 1 49.000002 Z M 1 0.5 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path99" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g115">
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="12.738281"
|
||||
y="17.249998"
|
||||
id="use101" />
|
||||
<use
|
||||
xlink:href="#glyph-0-2"
|
||||
x="17.743652"
|
||||
y="17.249998"
|
||||
id="use103" />
|
||||
<use
|
||||
xlink:href="#glyph-0-3"
|
||||
x="22.749022"
|
||||
y="17.249998"
|
||||
id="use105" />
|
||||
<use
|
||||
xlink:href="#glyph-0-4"
|
||||
x="27.754393"
|
||||
y="17.249998"
|
||||
id="use107" />
|
||||
<use
|
||||
xlink:href="#glyph-0-5"
|
||||
x="35.756832"
|
||||
y="17.249998"
|
||||
id="use109" />
|
||||
<use
|
||||
xlink:href="#glyph-0-6"
|
||||
x="41.254395"
|
||||
y="17.249998"
|
||||
id="use111" />
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="43.754883"
|
||||
y="17.249998"
|
||||
id="use113" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g125">
|
||||
<use
|
||||
xlink:href="#glyph-1-1"
|
||||
x="21.234373"
|
||||
y="32.25"
|
||||
id="use117" />
|
||||
<use
|
||||
xlink:href="#glyph-1-2"
|
||||
x="26.239744"
|
||||
y="32.25"
|
||||
id="use119" />
|
||||
<use
|
||||
xlink:href="#glyph-1-3"
|
||||
x="28.740232"
|
||||
y="32.25"
|
||||
id="use121" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="33.745605"
|
||||
y="32.25"
|
||||
id="use123" />
|
||||
</g>
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 41.000002 89.000004 L 41.000002 49.000002 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path127" />
|
||||
<g
|
||||
clip-path="url(#clip-0)"
|
||||
id="g131">
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="#000000"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="m 1,89.000004 219.00001,1.5"
|
||||
transform="matrix(0.75,0,0,0.75,0.375,0.375)"
|
||||
id="path129" />
|
||||
</g>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(100%, 100%, 100%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 140.000006 0.5 L 220.000009 0.5 L 220.000009 50.500002 L 140.000006 50.500002 Z M 140.000006 0.5 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path133" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g143">
|
||||
<use
|
||||
xlink:href="#glyph-0-7"
|
||||
x="125.73046"
|
||||
y="16.499998"
|
||||
id="use135" />
|
||||
<use
|
||||
xlink:href="#glyph-0-8"
|
||||
x="128.23096"
|
||||
y="16.499998"
|
||||
id="use137" />
|
||||
<use
|
||||
xlink:href="#glyph-0-9"
|
||||
x="134.23389"
|
||||
y="16.499998"
|
||||
id="use139" />
|
||||
<use
|
||||
xlink:href="#glyph-0-10"
|
||||
x="139.23926"
|
||||
y="16.499998"
|
||||
id="use141" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g157">
|
||||
<use
|
||||
xlink:href="#glyph-0-11"
|
||||
x="120.49218"
|
||||
y="27.749998"
|
||||
id="use145" />
|
||||
<use
|
||||
xlink:href="#glyph-0-12"
|
||||
x="126.99169"
|
||||
y="27.749998"
|
||||
id="use147" />
|
||||
<use
|
||||
xlink:href="#glyph-0-13"
|
||||
x="132.48926"
|
||||
y="27.749998"
|
||||
id="use149" />
|
||||
<use
|
||||
xlink:href="#glyph-0-14"
|
||||
x="137.98682"
|
||||
y="27.749998"
|
||||
id="use151" />
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="140.98389"
|
||||
y="27.749998"
|
||||
id="use153" />
|
||||
<use
|
||||
xlink:href="#glyph-0-15"
|
||||
x="145.98926"
|
||||
y="27.749998"
|
||||
id="use155" />
|
||||
</g>
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 182.000008 90.000004 L 182.000008 50.000002 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path159" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g167">
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="138.99609"
|
||||
y="49.499996"
|
||||
id="use161" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="141.49658"
|
||||
y="49.499996"
|
||||
id="use163" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="143.99707"
|
||||
y="49.499996"
|
||||
id="use165" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g205">
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="52.464844"
|
||||
y="60.749996"
|
||||
id="use169" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="57.470211"
|
||||
y="60.749996"
|
||||
id="use171" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="62.475582"
|
||||
y="60.749996"
|
||||
id="use173" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="67.480957"
|
||||
y="60.749996"
|
||||
id="use175" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="72.486328"
|
||||
y="60.749996"
|
||||
id="use177" />
|
||||
<use
|
||||
xlink:href="#glyph-1-8"
|
||||
x="74.986816"
|
||||
y="60.749996"
|
||||
id="use179" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="79.992188"
|
||||
y="60.749996"
|
||||
id="use181" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="84.997559"
|
||||
y="60.749996"
|
||||
id="use183" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="90.00293"
|
||||
y="60.749996"
|
||||
id="use185" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="92.50341"
|
||||
y="60.749996"
|
||||
id="use187" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="97.508781"
|
||||
y="60.749996"
|
||||
id="use189" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="100.00927"
|
||||
y="60.749996"
|
||||
id="use191" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="105.01464"
|
||||
y="60.749996"
|
||||
id="use193" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="107.51513"
|
||||
y="60.749996"
|
||||
id="use195" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="110.01562"
|
||||
y="60.749996"
|
||||
id="use197" />
|
||||
<use
|
||||
xlink:href="#glyph-1-11"
|
||||
x="115.02099"
|
||||
y="60.749996"
|
||||
id="use199" />
|
||||
<use
|
||||
xlink:href="#glyph-1-12"
|
||||
x="117.52148"
|
||||
y="60.749996"
|
||||
id="use201" />
|
||||
<use
|
||||
xlink:href="#glyph-1-13"
|
||||
x="122.52685"
|
||||
y="60.749996"
|
||||
id="use203" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 33 KiB |
@@ -0,0 +1,338 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="145.919998pt"
|
||||
height="73.919998pt"
|
||||
viewBox="0 0 145.919998 73.919998"
|
||||
version="1.1"
|
||||
id="svg139"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs67">
|
||||
<g
|
||||
id="g65">
|
||||
<g
|
||||
id="glyph-0-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.640625 L 5.640625 -5.640625 L 5.640625 0 Z M 1.265625 -0.140625 L 5.5 -0.140625 L 5.5 -5.5 L 1.265625 -5.5 Z M 1.265625 -0.140625 "
|
||||
id="path2" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-1">
|
||||
<path
|
||||
d="M 3.359375 -1.484375 L 4.59375 -1.28125 C 4.4375 -0.832031 4.1875 -0.488281 3.84375 -0.25 C 3.5 -0.0078125 3.070313 0.109375 2.5625 0.109375 C 1.75 0.109375 1.144531 -0.15625 0.75 -0.6875 C 0.4375 -1.113281 0.28125 -1.65625 0.28125 -2.3125 C 0.28125 -3.082031 0.484375 -3.6875 0.890625 -4.125 C 1.296875 -4.5625 1.8125 -4.78125 2.4375 -4.78125 C 3.132813 -4.78125 3.679688 -4.550781 4.078125 -4.09375 C 4.484375 -3.632813 4.675781 -2.929688 4.65625 -1.984375 L 1.5625 -1.984375 C 1.5625 -1.617188 1.65625 -1.332031 1.84375 -1.125 C 2.039063 -0.914063 2.285156 -0.8125 2.578125 -0.8125 C 2.765625 -0.8125 2.925781 -0.863281 3.0625 -0.96875 C 3.195313 -1.082031 3.296875 -1.253906 3.359375 -1.484375 Z M 3.4375 -2.75 C 3.425781 -3.101563 3.332031 -3.375 3.15625 -3.5625 C 2.976563 -3.75 2.765625 -3.84375 2.515625 -3.84375 C 2.242188 -3.84375 2.019531 -3.742188 1.84375 -3.546875 C 1.664063 -3.347656 1.578125 -3.082031 1.578125 -2.75 Z M 3.4375 -2.75 "
|
||||
id="path5" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-2">
|
||||
<path
|
||||
d="M 0.046875 0 L 1.734375 -2.40625 L 0.125 -4.6875 L 1.640625 -4.6875 L 2.46875 -3.390625 L 3.34375 -4.6875 L 4.796875 -4.6875 L 3.203125 -2.46875 L 4.9375 0 L 3.421875 0 L 2.46875 -1.453125 L 1.5 0 Z M 0.046875 0 "
|
||||
id="path8" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-3">
|
||||
<path
|
||||
d="M 1.578125 -3.25 L 0.453125 -3.453125 C 0.578125 -3.910156 0.789063 -4.242188 1.09375 -4.453125 C 1.40625 -4.671875 1.867188 -4.78125 2.484375 -4.78125 C 3.035156 -4.78125 3.445313 -4.710938 3.71875 -4.578125 C 3.988281 -4.453125 4.175781 -4.289063 4.28125 -4.09375 C 4.394531 -3.894531 4.453125 -3.523438 4.453125 -2.984375 L 4.4375 -1.53125 C 4.4375 -1.125 4.457031 -0.820313 4.5 -0.625 C 4.539063 -0.425781 4.613281 -0.21875 4.71875 0 L 3.5 0 C 3.457031 -0.0820313 3.414063 -0.203125 3.375 -0.359375 C 3.351563 -0.429688 3.335938 -0.484375 3.328125 -0.515625 C 3.117188 -0.304688 2.890625 -0.148438 2.640625 -0.046875 C 2.398438 0.0546875 2.144531 0.109375 1.875 0.109375 C 1.394531 0.109375 1.015625 -0.0195313 0.734375 -0.28125 C 0.460938 -0.539063 0.328125 -0.875 0.328125 -1.28125 C 0.328125 -1.539063 0.390625 -1.773438 0.515625 -1.984375 C 0.640625 -2.191406 0.816406 -2.347656 1.046875 -2.453125 C 1.273438 -2.566406 1.601563 -2.664063 2.03125 -2.75 C 2.601563 -2.863281 3.003906 -2.96875 3.234375 -3.0625 L 3.234375 -3.171875 C 3.234375 -3.410156 3.171875 -3.582031 3.046875 -3.6875 C 2.929688 -3.789063 2.710938 -3.84375 2.390625 -3.84375 C 2.171875 -3.84375 2 -3.796875 1.875 -3.703125 C 1.75 -3.617188 1.648438 -3.46875 1.578125 -3.25 Z M 3.234375 -2.25 C 3.078125 -2.195313 2.828125 -2.132813 2.484375 -2.0625 C 2.140625 -1.988281 1.910156 -1.914063 1.796875 -1.84375 C 1.640625 -1.726563 1.5625 -1.582031 1.5625 -1.40625 C 1.5625 -1.226563 1.625 -1.078125 1.75 -0.953125 C 1.882813 -0.828125 2.050781 -0.765625 2.25 -0.765625 C 2.46875 -0.765625 2.679688 -0.835938 2.890625 -0.984375 C 3.035156 -1.097656 3.132813 -1.234375 3.1875 -1.390625 C 3.21875 -1.503906 3.234375 -1.707031 3.234375 -2 Z M 3.234375 -2.25 "
|
||||
id="path11" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-4">
|
||||
<path
|
||||
d="M 0.5625 -4.6875 L 1.703125 -4.6875 L 1.703125 -4.046875 C 2.109375 -4.535156 2.59375 -4.78125 3.15625 -4.78125 C 3.457031 -4.78125 3.71875 -4.71875 3.9375 -4.59375 C 4.15625 -4.476563 4.335938 -4.296875 4.484375 -4.046875 C 4.679688 -4.296875 4.898438 -4.476563 5.140625 -4.59375 C 5.378906 -4.71875 5.632813 -4.78125 5.90625 -4.78125 C 6.25 -4.78125 6.539063 -4.710938 6.78125 -4.578125 C 7.019531 -4.441406 7.195313 -4.238281 7.3125 -3.96875 C 7.394531 -3.769531 7.4375 -3.445313 7.4375 -3 L 7.4375 0 L 6.203125 0 L 6.203125 -2.671875 C 6.203125 -3.140625 6.160156 -3.441406 6.078125 -3.578125 C 5.960938 -3.753906 5.785156 -3.84375 5.546875 -3.84375 C 5.367188 -3.84375 5.203125 -3.785156 5.046875 -3.671875 C 4.898438 -3.566406 4.789063 -3.410156 4.71875 -3.203125 C 4.65625 -3.003906 4.625 -2.6875 4.625 -2.25 L 4.625 0 L 3.390625 0 L 3.390625 -2.5625 C 3.390625 -3.019531 3.363281 -3.3125 3.3125 -3.4375 C 3.269531 -3.570313 3.203125 -3.671875 3.109375 -3.734375 C 3.023438 -3.804688 2.898438 -3.84375 2.734375 -3.84375 C 2.546875 -3.84375 2.375 -3.789063 2.21875 -3.6875 C 2.070313 -3.582031 1.960938 -3.429688 1.890625 -3.234375 C 1.828125 -3.046875 1.796875 -2.726563 1.796875 -2.28125 L 1.796875 0 L 0.5625 0 Z M 0.5625 -4.6875 "
|
||||
id="path14" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-5">
|
||||
<path
|
||||
d="M 0.609375 -4.6875 L 1.765625 -4.6875 L 1.765625 -4 C 1.921875 -4.226563 2.125 -4.414063 2.375 -4.5625 C 2.632813 -4.707031 2.921875 -4.78125 3.234375 -4.78125 C 3.773438 -4.78125 4.234375 -4.566406 4.609375 -4.140625 C 4.992188 -3.722656 5.1875 -3.132813 5.1875 -2.375 C 5.1875 -1.582031 4.992188 -0.96875 4.609375 -0.53125 C 4.222656 -0.101563 3.757813 0.109375 3.21875 0.109375 C 2.957031 0.109375 2.722656 0.0546875 2.515625 -0.046875 C 2.304688 -0.148438 2.085938 -0.328125 1.859375 -0.578125 L 1.859375 1.78125 L 0.609375 1.78125 Z M 1.84375 -2.421875 C 1.84375 -1.890625 1.945313 -1.5 2.15625 -1.25 C 2.363281 -1 2.617188 -0.875 2.921875 -0.875 C 3.203125 -0.875 3.4375 -0.988281 3.625 -1.21875 C 3.820313 -1.445313 3.921875 -1.828125 3.921875 -2.359375 C 3.921875 -2.847656 3.820313 -3.210938 3.625 -3.453125 C 3.425781 -3.691406 3.179688 -3.8125 2.890625 -3.8125 C 2.585938 -3.8125 2.335938 -3.691406 2.140625 -3.453125 C 1.941406 -3.222656 1.84375 -2.878906 1.84375 -2.421875 Z M 1.84375 -2.421875 "
|
||||
id="path17" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-6">
|
||||
<path
|
||||
d="M 0.640625 0 L 0.640625 -6.46875 L 1.890625 -6.46875 L 1.890625 0 Z M 0.640625 0 "
|
||||
id="path20" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.640625 L 5.640625 -5.640625 L 5.640625 0 Z M 1.265625 -0.140625 L 5.5 -0.140625 L 5.5 -5.5 L 1.265625 -5.5 Z M 1.265625 -0.140625 "
|
||||
id="path23" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-1">
|
||||
<path
|
||||
d="M 3.796875 -1.515625 L 4.625 -1.40625 C 4.488281 -0.925781 4.242188 -0.550781 3.890625 -0.28125 C 3.546875 -0.0195313 3.101563 0.109375 2.5625 0.109375 C 1.875 0.109375 1.328125 -0.0976563 0.921875 -0.515625 C 0.523438 -0.941406 0.328125 -1.535156 0.328125 -2.296875 C 0.328125 -3.085938 0.53125 -3.695313 0.9375 -4.125 C 1.34375 -4.5625 1.867188 -4.78125 2.515625 -4.78125 C 3.140625 -4.78125 3.648438 -4.566406 4.046875 -4.140625 C 4.441406 -3.722656 4.640625 -3.125 4.640625 -2.34375 C 4.640625 -2.300781 4.640625 -2.234375 4.640625 -2.140625 L 1.15625 -2.140625 C 1.175781 -1.617188 1.316406 -1.222656 1.578125 -0.953125 C 1.847656 -0.679688 2.175781 -0.546875 2.5625 -0.546875 C 2.851563 -0.546875 3.101563 -0.617188 3.3125 -0.765625 C 3.519531 -0.921875 3.679688 -1.171875 3.796875 -1.515625 Z M 1.1875 -2.796875 L 3.8125 -2.796875 C 3.769531 -3.179688 3.671875 -3.472656 3.515625 -3.671875 C 3.253906 -3.984375 2.925781 -4.140625 2.53125 -4.140625 C 2.164063 -4.140625 1.859375 -4.015625 1.609375 -3.765625 C 1.359375 -3.523438 1.21875 -3.203125 1.1875 -2.796875 Z M 1.1875 -2.796875 "
|
||||
id="path26" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-2">
|
||||
<path
|
||||
d="M 2.328125 -0.703125 L 2.4375 -0.015625 C 2.21875 0.0351563 2.019531 0.0625 1.84375 0.0625 C 1.550781 0.0625 1.328125 0.015625 1.171875 -0.078125 C 1.015625 -0.171875 0.898438 -0.289063 0.828125 -0.4375 C 0.765625 -0.582031 0.734375 -0.894531 0.734375 -1.375 L 0.734375 -4.0625 L 0.15625 -4.0625 L 0.15625 -4.6875 L 0.734375 -4.6875 L 0.734375 -5.84375 L 1.53125 -6.3125 L 1.53125 -4.6875 L 2.328125 -4.6875 L 2.328125 -4.0625 L 1.53125 -4.0625 L 1.53125 -1.328125 C 1.53125 -1.097656 1.539063 -0.953125 1.5625 -0.890625 C 1.59375 -0.828125 1.640625 -0.773438 1.703125 -0.734375 C 1.765625 -0.691406 1.859375 -0.671875 1.984375 -0.671875 C 2.066406 -0.671875 2.179688 -0.679688 2.328125 -0.703125 Z M 2.328125 -0.703125 "
|
||||
id="path29" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-3">
|
||||
<path
|
||||
d="M 0.59375 0 L 0.59375 -6.46875 L 1.390625 -6.46875 L 1.390625 -4.140625 C 1.753906 -4.566406 2.222656 -4.78125 2.796875 -4.78125 C 3.140625 -4.78125 3.4375 -4.710938 3.6875 -4.578125 C 3.945313 -4.441406 4.128906 -4.253906 4.234375 -4.015625 C 4.347656 -3.773438 4.40625 -3.425781 4.40625 -2.96875 L 4.40625 0 L 3.609375 0 L 3.609375 -2.96875 C 3.609375 -3.363281 3.519531 -3.648438 3.34375 -3.828125 C 3.175781 -4.015625 2.9375 -4.109375 2.625 -4.109375 C 2.394531 -4.109375 2.175781 -4.046875 1.96875 -3.921875 C 1.757813 -3.796875 1.609375 -3.628906 1.515625 -3.421875 C 1.429688 -3.210938 1.390625 -2.925781 1.390625 -2.5625 L 1.390625 0 Z M 0.59375 0 "
|
||||
id="path32" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-4">
|
||||
<path
|
||||
d="M 0.375 -3.1875 C 0.375 -3.945313 0.453125 -4.5625 0.609375 -5.03125 C 0.765625 -5.5 1 -5.859375 1.3125 -6.109375 C 1.625 -6.359375 2.015625 -6.484375 2.484375 -6.484375 C 2.828125 -6.484375 3.128906 -6.414063 3.390625 -6.28125 C 3.648438 -6.144531 3.863281 -5.941406 4.03125 -5.671875 C 4.207031 -5.410156 4.34375 -5.09375 4.4375 -4.71875 C 4.539063 -4.34375 4.59375 -3.832031 4.59375 -3.1875 C 4.59375 -2.425781 4.515625 -1.8125 4.359375 -1.34375 C 4.203125 -0.882813 3.96875 -0.523438 3.65625 -0.265625 C 3.34375 -0.015625 2.953125 0.109375 2.484375 0.109375 C 1.859375 0.109375 1.367188 -0.113281 1.015625 -0.5625 C 0.585938 -1.09375 0.375 -1.96875 0.375 -3.1875 Z M 1.1875 -3.1875 C 1.1875 -2.125 1.3125 -1.414063 1.5625 -1.0625 C 1.8125 -0.71875 2.117188 -0.546875 2.484375 -0.546875 C 2.847656 -0.546875 3.15625 -0.71875 3.40625 -1.0625 C 3.65625 -1.414063 3.78125 -2.125 3.78125 -3.1875 C 3.78125 -4.25 3.65625 -4.953125 3.40625 -5.296875 C 3.15625 -5.648438 2.84375 -5.828125 2.46875 -5.828125 C 2.101563 -5.828125 1.8125 -5.675781 1.59375 -5.375 C 1.320313 -4.976563 1.1875 -4.25 1.1875 -3.1875 Z M 1.1875 -3.1875 "
|
||||
id="path35" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-5">
|
||||
<path
|
||||
d="M 4.546875 -0.765625 L 4.546875 0 L 0.265625 0 C 0.265625 -0.1875 0.296875 -0.367188 0.359375 -0.546875 C 0.472656 -0.835938 0.648438 -1.125 0.890625 -1.40625 C 1.128906 -1.6875 1.472656 -2.015625 1.921875 -2.390625 C 2.628906 -2.960938 3.101563 -3.414063 3.34375 -3.75 C 3.59375 -4.09375 3.71875 -4.414063 3.71875 -4.71875 C 3.71875 -5.03125 3.601563 -5.289063 3.375 -5.5 C 3.15625 -5.71875 2.863281 -5.828125 2.5 -5.828125 C 2.125 -5.828125 1.820313 -5.710938 1.59375 -5.484375 C 1.363281 -5.253906 1.242188 -4.9375 1.234375 -4.53125 L 0.421875 -4.625 C 0.472656 -5.226563 0.679688 -5.6875 1.046875 -6 C 1.410156 -6.320313 1.898438 -6.484375 2.515625 -6.484375 C 3.140625 -6.484375 3.628906 -6.3125 3.984375 -5.96875 C 4.347656 -5.625 4.53125 -5.203125 4.53125 -4.703125 C 4.53125 -4.441406 4.476563 -4.1875 4.375 -3.9375 C 4.269531 -3.6875 4.09375 -3.421875 3.84375 -3.140625 C 3.601563 -2.867188 3.195313 -2.488281 2.625 -2 C 2.144531 -1.601563 1.835938 -1.332031 1.703125 -1.1875 C 1.578125 -1.050781 1.46875 -0.910156 1.375 -0.765625 Z M 4.546875 -0.765625 "
|
||||
id="path38" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-6">
|
||||
<path
|
||||
d="M 3.359375 0 L 2.578125 0 L 2.578125 -5.0625 C 2.378906 -4.875 2.125 -4.6875 1.8125 -4.5 C 1.507813 -4.320313 1.234375 -4.1875 0.984375 -4.09375 L 0.984375 -4.875 C 1.429688 -5.082031 1.816406 -5.332031 2.140625 -5.625 C 2.472656 -5.925781 2.710938 -6.210938 2.859375 -6.484375 L 3.359375 -6.484375 Z M 3.359375 0 "
|
||||
id="path41" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-7">
|
||||
<path
|
||||
d="M 0.8125 -3.78125 L 0.8125 -4.6875 L 1.71875 -4.6875 L 1.71875 -3.78125 Z M 0.8125 0 L 0.8125 -0.90625 L 1.71875 -0.90625 L 1.71875 0 Z M 0.8125 0 "
|
||||
id="path44" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-8">
|
||||
<path
|
||||
d="M 3.640625 0 L 3.640625 -0.59375 C 3.335938 -0.125 2.898438 0.109375 2.328125 0.109375 C 1.953125 0.109375 1.609375 0.00390625 1.296875 -0.203125 C 0.984375 -0.410156 0.738281 -0.695313 0.5625 -1.0625 C 0.394531 -1.4375 0.3125 -1.863281 0.3125 -2.34375 C 0.3125 -2.800781 0.390625 -3.222656 0.546875 -3.609375 C 0.703125 -3.992188 0.9375 -4.285156 1.25 -4.484375 C 1.5625 -4.679688 1.90625 -4.78125 2.28125 -4.78125 C 2.570313 -4.78125 2.828125 -4.722656 3.046875 -4.609375 C 3.265625 -4.492188 3.441406 -4.335938 3.578125 -4.140625 L 3.578125 -6.46875 L 4.375 -6.46875 L 4.375 0 Z M 1.125 -2.34375 C 1.125 -1.738281 1.25 -1.285156 1.5 -0.984375 C 1.757813 -0.691406 2.0625 -0.546875 2.40625 -0.546875 C 2.75 -0.546875 3.039063 -0.6875 3.28125 -0.96875 C 3.519531 -1.25 3.640625 -1.679688 3.640625 -2.265625 C 3.640625 -2.910156 3.515625 -3.378906 3.265625 -3.671875 C 3.023438 -3.972656 2.722656 -4.125 2.359375 -4.125 C 2.003906 -4.125 1.707031 -3.976563 1.46875 -3.6875 C 1.238281 -3.40625 1.125 -2.957031 1.125 -2.34375 Z M 1.125 -2.34375 "
|
||||
id="path47" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-9">
|
||||
<path
|
||||
d="M 1.328125 0 L 0.59375 0 L 0.59375 -6.46875 L 1.390625 -6.46875 L 1.390625 -4.15625 C 1.722656 -4.570313 2.148438 -4.78125 2.671875 -4.78125 C 2.953125 -4.78125 3.222656 -4.722656 3.484375 -4.609375 C 3.742188 -4.492188 3.957031 -4.332031 4.125 -4.125 C 4.289063 -3.914063 4.421875 -3.660156 4.515625 -3.359375 C 4.609375 -3.066406 4.65625 -2.75 4.65625 -2.40625 C 4.65625 -1.601563 4.457031 -0.984375 4.0625 -0.546875 C 3.664063 -0.109375 3.1875 0.109375 2.625 0.109375 C 2.070313 0.109375 1.640625 -0.125 1.328125 -0.59375 Z M 1.3125 -2.375 C 1.3125 -1.8125 1.390625 -1.40625 1.546875 -1.15625 C 1.796875 -0.75 2.132813 -0.546875 2.5625 -0.546875 C 2.90625 -0.546875 3.203125 -0.695313 3.453125 -1 C 3.710938 -1.300781 3.84375 -1.75 3.84375 -2.34375 C 3.84375 -2.957031 3.71875 -3.410156 3.46875 -3.703125 C 3.226563 -3.992188 2.9375 -4.140625 2.59375 -4.140625 C 2.25 -4.140625 1.945313 -3.988281 1.6875 -3.6875 C 1.4375 -3.382813 1.3125 -2.945313 1.3125 -2.375 Z M 1.3125 -2.375 "
|
||||
id="path50" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-10">
|
||||
<path
|
||||
d="M 1.59375 -3.5 C 1.269531 -3.625 1.023438 -3.796875 0.859375 -4.015625 C 0.703125 -4.242188 0.625 -4.515625 0.625 -4.828125 C 0.625 -5.296875 0.789063 -5.6875 1.125 -6 C 1.46875 -6.320313 1.921875 -6.484375 2.484375 -6.484375 C 3.046875 -6.484375 3.5 -6.320313 3.84375 -6 C 4.1875 -5.675781 4.359375 -5.273438 4.359375 -4.796875 C 4.359375 -4.503906 4.28125 -4.242188 4.125 -4.015625 C 3.96875 -3.796875 3.726563 -3.625 3.40625 -3.5 C 3.800781 -3.375 4.101563 -3.164063 4.3125 -2.875 C 4.519531 -2.59375 4.625 -2.25 4.625 -1.84375 C 4.625 -1.289063 4.425781 -0.828125 4.03125 -0.453125 C 3.644531 -0.078125 3.132813 0.109375 2.5 0.109375 C 1.851563 0.109375 1.332031 -0.078125 0.9375 -0.453125 C 0.550781 -0.828125 0.359375 -1.300781 0.359375 -1.875 C 0.359375 -2.289063 0.460938 -2.640625 0.671875 -2.921875 C 0.890625 -3.203125 1.195313 -3.394531 1.59375 -3.5 Z M 1.4375 -4.84375 C 1.4375 -4.539063 1.535156 -4.289063 1.734375 -4.09375 C 1.929688 -3.90625 2.1875 -3.8125 2.5 -3.8125 C 2.800781 -3.8125 3.050781 -3.90625 3.25 -4.09375 C 3.445313 -4.289063 3.546875 -4.53125 3.546875 -4.8125 C 3.546875 -5.101563 3.441406 -5.347656 3.234375 -5.546875 C 3.035156 -5.742188 2.785156 -5.84375 2.484375 -5.84375 C 2.179688 -5.84375 1.929688 -5.742188 1.734375 -5.546875 C 1.535156 -5.347656 1.4375 -5.113281 1.4375 -4.84375 Z M 1.1875 -1.859375 C 1.1875 -1.640625 1.238281 -1.421875 1.34375 -1.203125 C 1.445313 -0.992188 1.601563 -0.832031 1.8125 -0.71875 C 2.03125 -0.601563 2.257813 -0.546875 2.5 -0.546875 C 2.882813 -0.546875 3.195313 -0.664063 3.4375 -0.90625 C 3.6875 -1.15625 3.8125 -1.46875 3.8125 -1.84375 C 3.8125 -2.21875 3.679688 -2.53125 3.421875 -2.78125 C 3.171875 -3.03125 2.859375 -3.15625 2.484375 -3.15625 C 2.109375 -3.15625 1.796875 -3.03125 1.546875 -2.78125 C 1.304688 -2.539063 1.1875 -2.234375 1.1875 -1.859375 Z M 1.1875 -1.859375 "
|
||||
id="path53" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-11">
|
||||
<path
|
||||
d="M 0 0.109375 L 1.875 -6.578125 L 2.515625 -6.578125 L 0.640625 0.109375 Z M 0 0.109375 "
|
||||
id="path56" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-12">
|
||||
<path
|
||||
d="M 4.5 -4.875 L 3.703125 -4.8125 C 3.628906 -5.125 3.53125 -5.351563 3.40625 -5.5 C 3.1875 -5.726563 2.921875 -5.84375 2.609375 -5.84375 C 2.359375 -5.84375 2.132813 -5.769531 1.9375 -5.625 C 1.6875 -5.445313 1.488281 -5.179688 1.34375 -4.828125 C 1.207031 -4.472656 1.132813 -3.972656 1.125 -3.328125 C 1.320313 -3.617188 1.554688 -3.832031 1.828125 -3.96875 C 2.109375 -4.113281 2.398438 -4.1875 2.703125 -4.1875 C 3.234375 -4.1875 3.679688 -3.992188 4.046875 -3.609375 C 4.421875 -3.222656 4.609375 -2.71875 4.609375 -2.09375 C 4.609375 -1.6875 4.519531 -1.3125 4.34375 -0.96875 C 4.164063 -0.625 3.925781 -0.359375 3.625 -0.171875 C 3.320313 0.015625 2.972656 0.109375 2.578125 0.109375 C 1.921875 0.109375 1.382813 -0.128906 0.96875 -0.609375 C 0.550781 -1.097656 0.34375 -1.90625 0.34375 -3.03125 C 0.34375 -4.28125 0.570313 -5.1875 1.03125 -5.75 C 1.4375 -6.238281 1.976563 -6.484375 2.65625 -6.484375 C 3.164063 -6.484375 3.582031 -6.34375 3.90625 -6.0625 C 4.226563 -5.78125 4.425781 -5.382813 4.5 -4.875 Z M 1.25 -2.09375 C 1.25 -1.820313 1.304688 -1.5625 1.421875 -1.3125 C 1.535156 -1.0625 1.695313 -0.867188 1.90625 -0.734375 C 2.125 -0.609375 2.347656 -0.546875 2.578125 -0.546875 C 2.910156 -0.546875 3.195313 -0.679688 3.4375 -0.953125 C 3.675781 -1.222656 3.796875 -1.585938 3.796875 -2.046875 C 3.796875 -2.492188 3.675781 -2.847656 3.4375 -3.109375 C 3.195313 -3.367188 2.898438 -3.5 2.546875 -3.5 C 2.179688 -3.5 1.875 -3.367188 1.625 -3.109375 C 1.375 -2.847656 1.25 -2.507813 1.25 -2.09375 Z M 1.25 -2.09375 "
|
||||
id="path59" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-13">
|
||||
<path
|
||||
d="M 2.921875 0 L 2.921875 -1.546875 L 0.109375 -1.546875 L 0.109375 -2.28125 L 3.0625 -6.46875 L 3.71875 -6.46875 L 3.71875 -2.28125 L 4.59375 -2.28125 L 4.59375 -1.546875 L 3.71875 -1.546875 L 3.71875 0 Z M 2.921875 -2.28125 L 2.921875 -5.1875 L 0.890625 -2.28125 Z M 2.921875 -2.28125 "
|
||||
id="path62" />
|
||||
</g>
|
||||
</g>
|
||||
</defs>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(100%, 94.898987%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(83.918762%, 71.369934%, 33.729553%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 1.000054 1.000054 L 81.001187 1.000054 L 81.001187 51.000113 L 1.000054 51.000113 Z M 1.000054 1.000054 "
|
||||
transform="matrix(0.752577, 0, 0, 0.752577, 0.376289, 0.376289)"
|
||||
id="path69" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g85">
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="12.782054"
|
||||
y="18.81443"
|
||||
id="use71" />
|
||||
<use
|
||||
xlink:href="#glyph-0-2"
|
||||
x="17.804625"
|
||||
y="18.81443"
|
||||
id="use73" />
|
||||
<use
|
||||
xlink:href="#glyph-0-3"
|
||||
x="22.827196"
|
||||
y="18.81443"
|
||||
id="use75" />
|
||||
<use
|
||||
xlink:href="#glyph-0-4"
|
||||
x="27.849768"
|
||||
y="18.81443"
|
||||
id="use77" />
|
||||
<use
|
||||
xlink:href="#glyph-0-5"
|
||||
x="35.879707"
|
||||
y="18.81443"
|
||||
id="use79" />
|
||||
<use
|
||||
xlink:href="#glyph-0-6"
|
||||
x="41.396156"
|
||||
y="18.81443"
|
||||
id="use81" />
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="43.905239"
|
||||
y="18.81443"
|
||||
id="use83" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g95">
|
||||
<use
|
||||
xlink:href="#glyph-1-1"
|
||||
x="21.307343"
|
||||
y="33.865974"
|
||||
id="use87" />
|
||||
<use
|
||||
xlink:href="#glyph-1-2"
|
||||
x="26.329914"
|
||||
y="33.865974"
|
||||
id="use89" />
|
||||
<use
|
||||
xlink:href="#glyph-1-3"
|
||||
x="28.838995"
|
||||
y="33.865974"
|
||||
id="use91" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="33.861565"
|
||||
y="33.865974"
|
||||
id="use93" />
|
||||
</g>
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 40.998025 90.998084 L 40.998025 51.000113 "
|
||||
transform="matrix(0.752577, 0, 0, 0.752577, 0.376289, 0.376289)"
|
||||
id="path97" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 1.000054 90.998084 L 190.998203 90.998084 "
|
||||
transform="matrix(0.752577, 0, 0, 0.752577, 0.376289, 0.376289)"
|
||||
id="path99" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g129">
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="59.430084"
|
||||
y="62.463909"
|
||||
id="use101" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="64.452652"
|
||||
y="62.463909"
|
||||
id="use103" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="69.475227"
|
||||
y="62.463909"
|
||||
id="use105" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="74.497795"
|
||||
y="62.463909"
|
||||
id="use107" />
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="79.52037"
|
||||
y="62.463909"
|
||||
id="use109" />
|
||||
<use
|
||||
xlink:href="#glyph-1-8"
|
||||
x="82.029449"
|
||||
y="62.463909"
|
||||
id="use111" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="87.052017"
|
||||
y="62.463909"
|
||||
id="use113" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="92.074593"
|
||||
y="62.463909"
|
||||
id="use115" />
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="97.09716"
|
||||
y="62.463909"
|
||||
id="use117" />
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="99.606239"
|
||||
y="62.463909"
|
||||
id="use119" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="102.11533"
|
||||
y="62.463909"
|
||||
id="use121" />
|
||||
<use
|
||||
xlink:href="#glyph-1-11"
|
||||
x="107.13789"
|
||||
y="62.463909"
|
||||
id="use123" />
|
||||
<use
|
||||
xlink:href="#glyph-1-12"
|
||||
x="109.64697"
|
||||
y="62.463909"
|
||||
id="use125" />
|
||||
<use
|
||||
xlink:href="#glyph-1-13"
|
||||
x="114.66955"
|
||||
y="62.463909"
|
||||
id="use127" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g137">
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="17.556215"
|
||||
y="48.917519"
|
||||
id="use131" />
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="20.065296"
|
||||
y="48.917519"
|
||||
id="use133" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="22.574377"
|
||||
y="48.917519"
|
||||
id="use135" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 23 KiB |
@@ -0,0 +1,478 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="234pt"
|
||||
height="155.039993pt"
|
||||
viewBox="0 0 234 155.039993"
|
||||
version="1.1"
|
||||
id="svg141"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs53">
|
||||
<g
|
||||
id="g48">
|
||||
<g
|
||||
id="glyph-0-0" />
|
||||
<g
|
||||
id="glyph-0-1">
|
||||
<path
|
||||
d="M 4.078125 0.15625 C 3.578125 0.15625 3.117188 0.078125 2.703125 -0.078125 C 2.296875 -0.234375 1.945313 -0.460938 1.65625 -0.765625 C 1.363281 -1.066406 1.132813 -1.4375 0.96875 -1.875 C 0.8125 -2.320313 0.734375 -2.832031 0.734375 -3.40625 C 0.734375 -3.988281 0.816406 -4.503906 0.984375 -4.953125 C 1.148438 -5.398438 1.375 -5.773438 1.65625 -6.078125 C 1.9375 -6.390625 2.269531 -6.625 2.65625 -6.78125 C 3.039063 -6.9375 3.453125 -7.015625 3.890625 -7.015625 C 4.273438 -7.015625 4.632813 -6.945313 4.96875 -6.8125 C 5.3125 -6.6875 5.609375 -6.488281 5.859375 -6.21875 C 6.109375 -5.957031 6.304688 -5.625 6.453125 -5.21875 C 6.597656 -4.8125 6.671875 -4.328125 6.671875 -3.765625 C 6.671875 -3.679688 6.664063 -3.597656 6.65625 -3.515625 C 6.65625 -3.429688 6.648438 -3.347656 6.640625 -3.265625 L 1.765625 -3.265625 C 1.785156 -2.828125 1.859375 -2.445313 1.984375 -2.125 C 2.117188 -1.800781 2.289063 -1.535156 2.5 -1.328125 C 2.707031 -1.117188 2.945313 -0.960938 3.21875 -0.859375 C 3.5 -0.765625 3.796875 -0.71875 4.109375 -0.71875 C 4.347656 -0.71875 4.570313 -0.742188 4.78125 -0.796875 C 4.988281 -0.859375 5.1875 -0.945313 5.375 -1.0625 C 5.5625 -1.175781 5.726563 -1.316406 5.875 -1.484375 L 6.484375 -0.90625 C 6.285156 -0.675781 6.0625 -0.476563 5.8125 -0.3125 C 5.570313 -0.15625 5.304688 -0.0390625 5.015625 0.03125 C 4.734375 0.113281 4.421875 0.15625 4.078125 0.15625 Z M 1.8125 -4.109375 L 5.578125 -4.109375 C 5.578125 -4.429688 5.535156 -4.71875 5.453125 -4.96875 C 5.367188 -5.226563 5.25 -5.445313 5.09375 -5.625 C 4.9375 -5.8125 4.75 -5.953125 4.53125 -6.046875 C 4.320313 -6.140625 4.082031 -6.1875 3.8125 -6.1875 C 3.570313 -6.1875 3.34375 -6.144531 3.125 -6.0625 C 2.914063 -5.988281 2.71875 -5.863281 2.53125 -5.6875 C 2.351563 -5.519531 2.203125 -5.304688 2.078125 -5.046875 C 1.953125 -4.785156 1.863281 -4.472656 1.8125 -4.109375 Z M 1.8125 -4.109375 "
|
||||
id="path3" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-2">
|
||||
<path
|
||||
d="M 4.484375 0.109375 C 4.046875 0.109375 3.6875 0.0351563 3.40625 -0.109375 C 3.125 -0.265625 2.90625 -0.5 2.75 -0.8125 C 2.601563 -1.132813 2.507813 -1.535156 2.46875 -2.015625 C 2.425781 -2.492188 2.414063 -3.0625 2.4375 -3.71875 L 2.609375 -8.609375 L 3.734375 -8.75 L 3.890625 -8.765625 L 3.90625 -8.65625 C 3.851563 -8.582031 3.804688 -8.507813 3.765625 -8.4375 C 3.734375 -8.375 3.707031 -8.253906 3.6875 -8.078125 L 3.5625 -6.390625 L 3.59375 -6.125 L 3.5 -3.640625 C 3.46875 -2.878906 3.484375 -2.289063 3.546875 -1.875 C 3.617188 -1.46875 3.742188 -1.1875 3.921875 -1.03125 C 4.109375 -0.875 4.351563 -0.796875 4.65625 -0.796875 C 4.976563 -0.796875 5.265625 -0.859375 5.515625 -0.984375 C 5.773438 -1.117188 6.046875 -1.285156 6.328125 -1.484375 L 6.65625 -0.625 C 6.320313 -0.375 5.972656 -0.1875 5.609375 -0.0625 C 5.242188 0.0507813 4.867188 0.109375 4.484375 0.109375 Z M 1.046875 -6.859375 L 5.984375 -6.859375 L 5.984375 -5.96875 L 1.046875 -5.96875 Z M 1.046875 -6.859375 "
|
||||
id="path6" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-3">
|
||||
<path
|
||||
d="M 1.09375 -9.96875 L 2.28125 -9.96875 L 2.28125 -9.875 C 2.21875 -9.8125 2.175781 -9.742188 2.15625 -9.671875 C 2.144531 -9.597656 2.140625 -9.476563 2.140625 -9.3125 L 2.140625 -5.640625 C 2.328125 -5.921875 2.539063 -6.160156 2.78125 -6.359375 C 3.03125 -6.566406 3.289063 -6.726563 3.5625 -6.84375 C 3.832031 -6.957031 4.109375 -7.015625 4.390625 -7.015625 C 4.804688 -7.015625 5.171875 -6.921875 5.484375 -6.734375 C 5.796875 -6.546875 6.039063 -6.238281 6.21875 -5.8125 C 6.394531 -5.394531 6.484375 -4.84375 6.484375 -4.15625 L 6.484375 0 L 5.4375 0 L 5.4375 -4.125 C 5.4375 -4.601563 5.378906 -4.984375 5.265625 -5.265625 C 5.148438 -5.554688 5 -5.765625 4.8125 -5.890625 C 4.625 -6.015625 4.410156 -6.078125 4.171875 -6.078125 C 3.992188 -6.078125 3.804688 -6.046875 3.609375 -5.984375 C 3.421875 -5.921875 3.238281 -5.828125 3.0625 -5.703125 C 2.894531 -5.585938 2.738281 -5.441406 2.59375 -5.265625 C 2.457031 -5.097656 2.347656 -4.898438 2.265625 -4.671875 C 2.179688 -4.453125 2.140625 -4.207031 2.140625 -3.9375 L 2.140625 0 L 1.09375 0 Z M 1.09375 -9.96875 "
|
||||
id="path9" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-4">
|
||||
<path
|
||||
d="M 1.609375 -2.3125 L 5.609375 -7.453125 L 5.953125 -6.75 L 1.953125 -1.671875 Z M 3.75 0.171875 C 3.125 0.171875 2.597656 -0.0078125 2.171875 -0.375 C 1.742188 -0.75 1.414063 -1.296875 1.1875 -2.015625 C 0.96875 -2.734375 0.859375 -3.601563 0.859375 -4.625 C 0.859375 -5.613281 0.96875 -6.460938 1.1875 -7.171875 C 1.414063 -7.890625 1.742188 -8.441406 2.171875 -8.828125 C 2.597656 -9.210938 3.125 -9.40625 3.75 -9.40625 C 4.375 -9.40625 4.898438 -9.210938 5.328125 -8.828125 C 5.753906 -8.441406 6.078125 -7.890625 6.296875 -7.171875 C 6.523438 -6.460938 6.640625 -5.613281 6.640625 -4.625 C 6.640625 -3.601563 6.523438 -2.734375 6.296875 -2.015625 C 6.078125 -1.296875 5.753906 -0.75 5.328125 -0.375 C 4.898438 -0.0078125 4.375 0.171875 3.75 0.171875 Z M 3.75 -0.75 C 4.125 -0.75 4.445313 -0.898438 4.71875 -1.203125 C 4.988281 -1.503906 5.195313 -1.941406 5.34375 -2.515625 C 5.488281 -3.085938 5.5625 -3.789063 5.5625 -4.625 C 5.5625 -5.414063 5.488281 -6.097656 5.34375 -6.671875 C 5.195313 -7.242188 4.988281 -7.6875 4.71875 -8 C 4.445313 -8.320313 4.125 -8.484375 3.75 -8.484375 C 3.375 -8.484375 3.050781 -8.320313 2.78125 -8 C 2.507813 -7.6875 2.300781 -7.242188 2.15625 -6.671875 C 2.007813 -6.097656 1.9375 -5.414063 1.9375 -4.625 C 1.9375 -3.789063 2.007813 -3.085938 2.15625 -2.515625 C 2.300781 -1.941406 2.507813 -1.503906 2.78125 -1.203125 C 3.050781 -0.898438 3.375 -0.75 3.75 -0.75 Z M 3.75 -0.75 "
|
||||
id="path12" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-5">
|
||||
<path
|
||||
d="M 1.5 0 L 1.5 -0.875 L 3.25 -0.875 L 3.25 -5.984375 L 1.59375 -5.984375 L 1.59375 -6.859375 L 4.328125 -6.859375 L 4.328125 -0.875 L 5.9375 -0.875 L 5.9375 0 Z M 3.734375 -8.296875 C 3.523438 -8.296875 3.34375 -8.367188 3.1875 -8.515625 C 3.039063 -8.671875 2.96875 -8.851563 2.96875 -9.0625 C 2.96875 -9.28125 3.039063 -9.460938 3.1875 -9.609375 C 3.332031 -9.765625 3.515625 -9.84375 3.734375 -9.84375 C 3.941406 -9.84375 4.125 -9.765625 4.28125 -9.609375 C 4.4375 -9.453125 4.515625 -9.269531 4.515625 -9.0625 C 4.515625 -8.851563 4.4375 -8.671875 4.28125 -8.515625 C 4.125 -8.367188 3.941406 -8.296875 3.734375 -8.296875 Z M 3.734375 -8.296875 "
|
||||
id="path15" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-6">
|
||||
<path
|
||||
d="M 0.90625 2.5 L 0.90625 -6.859375 L 2 -6.859375 L 2 -5.5 C 2.101563 -5.851563 2.257813 -6.140625 2.46875 -6.359375 C 2.675781 -6.578125 2.914063 -6.738281 3.1875 -6.84375 C 3.457031 -6.945313 3.753906 -7 4.078125 -7 C 4.460938 -7 4.828125 -6.925781 5.171875 -6.78125 C 5.515625 -6.632813 5.816406 -6.414063 6.078125 -6.125 C 6.347656 -5.84375 6.554688 -5.476563 6.703125 -5.03125 C 6.859375 -4.59375 6.9375 -4.078125 6.9375 -3.484375 C 6.9375 -2.878906 6.851563 -2.347656 6.6875 -1.890625 C 6.53125 -1.429688 6.3125 -1.046875 6.03125 -0.734375 C 5.757813 -0.429688 5.453125 -0.203125 5.109375 -0.046875 C 4.765625 0.109375 4.410156 0.1875 4.046875 0.1875 C 3.773438 0.1875 3.507813 0.140625 3.25 0.046875 C 3 -0.0351563 2.769531 -0.15625 2.5625 -0.3125 C 2.351563 -0.476563 2.171875 -0.675781 2.015625 -0.90625 L 2.015625 2.5 Z M 3.875 -0.78125 C 4.113281 -0.78125 4.347656 -0.820313 4.578125 -0.90625 C 4.804688 -0.988281 5.015625 -1.128906 5.203125 -1.328125 C 5.390625 -1.535156 5.535156 -1.8125 5.640625 -2.15625 C 5.753906 -2.5 5.8125 -2.925781 5.8125 -3.4375 C 5.8125 -3.988281 5.742188 -4.457031 5.609375 -4.84375 C 5.472656 -5.226563 5.269531 -5.523438 5 -5.734375 C 4.738281 -5.941406 4.414063 -6.054688 4.03125 -6.078125 C 3.75 -6.097656 3.484375 -6.054688 3.234375 -5.953125 C 2.992188 -5.859375 2.78125 -5.691406 2.59375 -5.453125 C 2.40625 -5.222656 2.257813 -4.921875 2.15625 -4.546875 C 2.050781 -4.171875 2 -3.71875 2 -3.1875 C 2.007813 -2.875 2.039063 -2.585938 2.09375 -2.328125 C 2.15625 -2.066406 2.238281 -1.835938 2.34375 -1.640625 C 2.457031 -1.441406 2.585938 -1.28125 2.734375 -1.15625 C 2.890625 -1.03125 3.0625 -0.9375 3.25 -0.875 C 3.445313 -0.8125 3.65625 -0.78125 3.875 -0.78125 Z M 3.875 -0.78125 "
|
||||
id="path18" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-7">
|
||||
<path
|
||||
d="M 1.1875 0 L 1.1875 -0.875 L 3.203125 -0.875 L 3.203125 -9.109375 L 1.28125 -9.109375 L 1.28125 -9.96875 L 4.3125 -9.96875 L 4.3125 -0.875 L 6.3125 -0.875 L 6.3125 0 Z M 1.1875 0 "
|
||||
id="path21" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-8">
|
||||
<path
|
||||
d="M 3.75 0.125 C 3.125 0.125 2.570313 -0.0234375 2.09375 -0.328125 C 1.625 -0.640625 1.253906 -1.0625 0.984375 -1.59375 C 0.710938 -2.132813 0.578125 -2.75 0.578125 -3.4375 C 0.578125 -4.132813 0.710938 -4.75 0.984375 -5.28125 C 1.253906 -5.820313 1.625 -6.242188 2.09375 -6.546875 C 2.570313 -6.847656 3.125 -7 3.75 -7 C 4.375 -7 4.921875 -6.847656 5.390625 -6.546875 C 5.867188 -6.242188 6.242188 -5.820313 6.515625 -5.28125 C 6.785156 -4.75 6.921875 -4.132813 6.921875 -3.4375 C 6.921875 -2.75 6.785156 -2.132813 6.515625 -1.59375 C 6.242188 -1.0625 5.867188 -0.640625 5.390625 -0.328125 C 4.921875 -0.0234375 4.375 0.125 3.75 0.125 Z M 3.75 -0.78125 C 4.144531 -0.78125 4.492188 -0.894531 4.796875 -1.125 C 5.097656 -1.351563 5.335938 -1.664063 5.515625 -2.0625 C 5.691406 -2.46875 5.78125 -2.929688 5.78125 -3.453125 C 5.78125 -3.972656 5.691406 -4.429688 5.515625 -4.828125 C 5.335938 -5.234375 5.097656 -5.546875 4.796875 -5.765625 C 4.492188 -5.992188 4.144531 -6.109375 3.75 -6.109375 C 3.363281 -6.109375 3.015625 -5.992188 2.703125 -5.765625 C 2.398438 -5.546875 2.160156 -5.234375 1.984375 -4.828125 C 1.804688 -4.429688 1.71875 -3.972656 1.71875 -3.453125 C 1.71875 -2.929688 1.804688 -2.46875 1.984375 -2.0625 C 2.160156 -1.664063 2.398438 -1.351563 2.703125 -1.125 C 3.015625 -0.894531 3.363281 -0.78125 3.75 -0.78125 Z M 3.75 -0.78125 "
|
||||
id="path24" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-0">
|
||||
<path
|
||||
d="M 1.6875 0 L 1.6875 -8.4375 L 8.4375 -8.4375 L 8.4375 0 Z M 1.90625 -0.21875 L 8.234375 -0.21875 L 8.234375 -8.234375 L 1.90625 -8.234375 Z M 1.90625 -0.21875 "
|
||||
id="path27" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-1">
|
||||
<path
|
||||
d="M 5.015625 -2.234375 L 6.875 -1.921875 C 6.632813 -1.242188 6.257813 -0.726563 5.75 -0.375 C 5.238281 -0.0195313 4.597656 0.15625 3.828125 0.15625 C 2.609375 0.15625 1.707031 -0.238281 1.125 -1.03125 C 0.65625 -1.664063 0.421875 -2.472656 0.421875 -3.453125 C 0.421875 -4.609375 0.722656 -5.515625 1.328125 -6.171875 C 1.941406 -6.828125 2.710938 -7.15625 3.640625 -7.15625 C 4.679688 -7.15625 5.5 -6.8125 6.09375 -6.125 C 6.695313 -5.4375 6.988281 -4.382813 6.96875 -2.96875 L 2.328125 -2.96875 C 2.335938 -2.414063 2.484375 -1.984375 2.765625 -1.671875 C 3.054688 -1.367188 3.414063 -1.21875 3.84375 -1.21875 C 4.132813 -1.21875 4.378906 -1.296875 4.578125 -1.453125 C 4.773438 -1.617188 4.921875 -1.878906 5.015625 -2.234375 Z M 5.125 -4.09375 C 5.113281 -4.632813 4.972656 -5.039063 4.703125 -5.3125 C 4.441406 -5.59375 4.125 -5.734375 3.75 -5.734375 C 3.34375 -5.734375 3.007813 -5.585938 2.75 -5.296875 C 2.488281 -5.003906 2.359375 -4.601563 2.359375 -4.09375 Z M 5.125 -4.09375 "
|
||||
id="path30" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-2">
|
||||
<path
|
||||
d="M 0.078125 0 L 2.609375 -3.609375 L 0.1875 -7 L 2.453125 -7 L 3.6875 -5.078125 L 4.984375 -7 L 7.171875 -7 L 4.796875 -3.6875 L 7.390625 0 L 5.109375 0 L 3.6875 -2.171875 L 2.25 0 Z M 0.078125 0 "
|
||||
id="path33" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-3">
|
||||
<path
|
||||
d="M 2.359375 -4.859375 L 0.671875 -5.171875 C 0.859375 -5.847656 1.179688 -6.347656 1.640625 -6.671875 C 2.109375 -6.992188 2.796875 -7.15625 3.703125 -7.15625 C 4.523438 -7.15625 5.140625 -7.054688 5.546875 -6.859375 C 5.953125 -6.671875 6.238281 -6.425781 6.40625 -6.125 C 6.570313 -5.820313 6.65625 -5.269531 6.65625 -4.46875 L 6.625 -2.296875 C 6.625 -1.679688 6.65625 -1.226563 6.71875 -0.9375 C 6.78125 -0.644531 6.890625 -0.332031 7.046875 0 L 5.21875 0 C 5.164063 -0.125 5.109375 -0.304688 5.046875 -0.546875 C 5.015625 -0.660156 4.992188 -0.734375 4.984375 -0.765625 C 4.660156 -0.453125 4.316406 -0.21875 3.953125 -0.0625 C 3.597656 0.0820313 3.21875 0.15625 2.8125 0.15625 C 2.09375 0.15625 1.523438 -0.0351563 1.109375 -0.421875 C 0.691406 -0.816406 0.484375 -1.3125 0.484375 -1.90625 C 0.484375 -2.300781 0.578125 -2.65625 0.765625 -2.96875 C 0.953125 -3.28125 1.210938 -3.515625 1.546875 -3.671875 C 1.890625 -3.835938 2.382813 -3.984375 3.03125 -4.109375 C 3.894531 -4.273438 4.492188 -4.425781 4.828125 -4.5625 L 4.828125 -4.75 C 4.828125 -5.101563 4.738281 -5.351563 4.5625 -5.5 C 4.382813 -5.65625 4.054688 -5.734375 3.578125 -5.734375 C 3.242188 -5.734375 2.984375 -5.671875 2.796875 -5.546875 C 2.617188 -5.421875 2.472656 -5.191406 2.359375 -4.859375 Z M 4.828125 -3.359375 C 4.585938 -3.285156 4.210938 -3.191406 3.703125 -3.078125 C 3.191406 -2.960938 2.859375 -2.851563 2.703125 -2.75 C 2.453125 -2.582031 2.328125 -2.367188 2.328125 -2.109375 C 2.328125 -1.847656 2.421875 -1.617188 2.609375 -1.421875 C 2.804688 -1.234375 3.054688 -1.140625 3.359375 -1.140625 C 3.691406 -1.140625 4.007813 -1.253906 4.3125 -1.484375 C 4.539063 -1.648438 4.691406 -1.851563 4.765625 -2.09375 C 4.804688 -2.25 4.828125 -2.550781 4.828125 -3 Z M 4.828125 -3.359375 "
|
||||
id="path36" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-4">
|
||||
<path
|
||||
d="M 0.828125 -7 L 2.53125 -7 L 2.53125 -6.046875 C 3.144531 -6.785156 3.875 -7.15625 4.71875 -7.15625 C 5.164063 -7.15625 5.550781 -7.0625 5.875 -6.875 C 6.207031 -6.695313 6.484375 -6.421875 6.703125 -6.046875 C 7.003906 -6.421875 7.332031 -6.695313 7.6875 -6.875 C 8.050781 -7.0625 8.429688 -7.15625 8.828125 -7.15625 C 9.347656 -7.15625 9.785156 -7.050781 10.140625 -6.84375 C 10.492188 -6.632813 10.757813 -6.328125 10.9375 -5.921875 C 11.0625 -5.628906 11.125 -5.144531 11.125 -4.46875 L 11.125 0 L 9.28125 0 L 9.28125 -4 C 9.28125 -4.695313 9.210938 -5.144531 9.078125 -5.34375 C 8.910156 -5.601563 8.648438 -5.734375 8.296875 -5.734375 C 8.035156 -5.734375 7.789063 -5.65625 7.5625 -5.5 C 7.332031 -5.34375 7.164063 -5.109375 7.0625 -4.796875 C 6.96875 -4.492188 6.921875 -4.015625 6.921875 -3.359375 L 6.921875 0 L 5.0625 0 L 5.0625 -3.84375 C 5.0625 -4.519531 5.023438 -4.957031 4.953125 -5.15625 C 4.890625 -5.351563 4.789063 -5.5 4.65625 -5.59375 C 4.519531 -5.6875 4.332031 -5.734375 4.09375 -5.734375 C 3.8125 -5.734375 3.554688 -5.65625 3.328125 -5.5 C 3.097656 -5.351563 2.929688 -5.132813 2.828125 -4.84375 C 2.734375 -4.550781 2.6875 -4.070313 2.6875 -3.40625 L 2.6875 0 L 0.828125 0 Z M 0.828125 -7 "
|
||||
id="path39" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-5">
|
||||
<path
|
||||
d="M 0.921875 -7 L 2.640625 -7 L 2.640625 -5.96875 C 2.867188 -6.320313 3.171875 -6.609375 3.546875 -6.828125 C 3.929688 -7.046875 4.359375 -7.15625 4.828125 -7.15625 C 5.640625 -7.15625 6.328125 -6.835938 6.890625 -6.203125 C 7.460938 -5.566406 7.75 -4.679688 7.75 -3.546875 C 7.75 -2.367188 7.460938 -1.457031 6.890625 -0.8125 C 6.316406 -0.164063 5.625 0.15625 4.8125 0.15625 C 4.425781 0.15625 4.078125 0.0820313 3.765625 -0.0625 C 3.453125 -0.21875 3.117188 -0.484375 2.765625 -0.859375 L 2.765625 2.65625 L 0.921875 2.65625 Z M 2.75 -3.625 C 2.75 -2.832031 2.90625 -2.25 3.21875 -1.875 C 3.53125 -1.5 3.910156 -1.3125 4.359375 -1.3125 C 4.785156 -1.3125 5.140625 -1.484375 5.421875 -1.828125 C 5.710938 -2.171875 5.859375 -2.738281 5.859375 -3.53125 C 5.859375 -4.257813 5.710938 -4.800781 5.421875 -5.15625 C 5.128906 -5.519531 4.765625 -5.703125 4.328125 -5.703125 C 3.867188 -5.703125 3.488281 -5.523438 3.1875 -5.171875 C 2.894531 -4.816406 2.75 -4.300781 2.75 -3.625 Z M 2.75 -3.625 "
|
||||
id="path42" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-6">
|
||||
<path
|
||||
d="M 0.96875 0 L 0.96875 -9.65625 L 2.828125 -9.65625 L 2.828125 0 Z M 0.96875 0 "
|
||||
id="path45" />
|
||||
</g>
|
||||
</g>
|
||||
<clipPath
|
||||
id="clip-0">
|
||||
<path
|
||||
clip-rule="nonzero"
|
||||
d="M 72 118 L 94 118 L 94 153 L 72 153 Z M 72 118 "
|
||||
id="path50" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(100%, 94.898987%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(83.918762%, 71.369934%, 33.729553%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 40.000002 1 L 310.000013 1 L 310.000013 201.000008 L 40.000002 201.000008 Z M 40.000002 1 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path55" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(97.24884%, 80.778503%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(72.158813%, 32.939148%, 31.369019%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 70.000003 122.000005 L 150.000006 122.000005 L 150.000006 162.000007 L 70.000003 162.000007 Z M 70.000003 122.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path57" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g67">
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="67.5"
|
||||
y="111.74999"
|
||||
id="use59" />
|
||||
<use
|
||||
xlink:href="#glyph-0-2"
|
||||
x="75"
|
||||
y="111.74999"
|
||||
id="use61" />
|
||||
<use
|
||||
xlink:href="#glyph-0-3"
|
||||
x="82.5"
|
||||
y="111.74999"
|
||||
id="use63" />
|
||||
<use
|
||||
xlink:href="#glyph-0-4"
|
||||
x="89.999992"
|
||||
y="111.74999"
|
||||
id="use65" />
|
||||
</g>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(97.24884%, 80.778503%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(72.158813%, 32.939148%, 31.369019%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 120.000005 112.000005 L 140.000006 112.000005 L 140.000006 122.000005 L 120.000005 122.000005 Z M 120.000005 112.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path69" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(97.24884%, 80.778503%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(72.158813%, 32.939148%, 31.369019%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 85.000005 116.999996 C 91.666672 116.999996 95.000006 120.333329 95.000006 126.999996 C 95.000006 133.666663 91.666672 136.999997 85.000005 136.999997 Z M 85.000005 116.999996 "
|
||||
transform="matrix(0, 0.75, -0.75, 0, 162.749993, 27.749999)"
|
||||
id="path71" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(72.158813%, 32.939148%, 31.369019%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 80.000003 167.000007 L 140.000006 167.000007 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path73" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(96.078491%, 96.078491%, 96.078491%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 110.000005 76.000003 C 110.000005 77.312503 109.869796 78.614587 109.614588 79.901045 C 109.35938 81.187503 108.979171 82.442712 108.479171 83.656253 C 107.973963 84.864587 107.359379 86.020837 106.630213 87.109379 C 105.901046 88.203129 105.072921 89.213545 104.140629 90.140629 C 103.213546 91.07292 102.203129 91.901045 101.109379 92.630212 C 100.020838 93.359379 98.864587 93.973962 97.656254 94.479171 C 96.442712 94.979171 95.187504 95.359379 93.901046 95.614587 C 92.614587 95.869796 91.312504 96.000004 90.000004 96.000004 C 88.687504 96.000004 87.38542 95.869796 86.098962 95.614587 C 84.812504 95.359379 83.557295 94.979171 82.343753 94.479171 C 81.13542 93.973962 79.97917 93.359379 78.890628 92.630212 C 77.796878 91.901045 76.786462 91.07292 75.859378 90.140629 C 74.927086 89.213545 74.098961 88.203129 73.369795 87.109379 C 72.640628 86.020837 72.026045 84.864587 71.520836 83.656253 C 71.020836 82.442712 70.640628 81.187503 70.38542 79.901045 C 70.130211 78.614587 70.000003 77.312503 70.000003 76.000003 C 70.000003 74.687503 70.130211 73.38542 70.38542 72.098961 C 70.640628 70.812503 71.020836 69.557295 71.520836 68.343753 C 72.026045 67.135419 72.640628 65.979169 73.369795 64.890628 C 74.098961 63.796878 74.927086 62.786461 75.859378 61.859378 C 76.786462 60.927086 77.796878 60.098961 78.890628 59.369794 C 79.97917 58.640627 81.13542 58.026044 82.343753 57.520836 C 83.557295 57.020836 84.812504 56.640627 86.098962 56.385419 C 87.38542 56.130211 88.687504 56.000002 90.000004 56.000002 C 91.312504 56.000002 92.614587 56.130211 93.901046 56.385419 C 95.187504 56.640627 96.442712 57.020836 97.656254 57.520836 C 98.864587 58.026044 100.020838 58.640627 101.109379 59.369794 C 102.203129 60.098961 103.213546 60.927086 104.140629 61.859378 C 105.072921 62.786461 105.901046 63.796878 106.630213 64.890628 C 107.359379 65.979169 107.973963 67.135419 108.479171 68.343753 C 108.979171 69.557295 109.35938 70.812503 109.614588 72.098961 C 109.869796 73.38542 110.000005 74.687503 110.000005 76.000003 Z M 110.000005 76.000003 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path75" />
|
||||
<g
|
||||
fill="#333333"
|
||||
fill-opacity="1"
|
||||
id="g81">
|
||||
<use
|
||||
xlink:href="#glyph-0-5"
|
||||
x="59.999996"
|
||||
y="62.249996"
|
||||
id="use77" />
|
||||
<use
|
||||
xlink:href="#glyph-0-6"
|
||||
x="67.5"
|
||||
y="62.249996"
|
||||
id="use79" />
|
||||
</g>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(96.078491%, 96.078491%, 96.078491%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 85.000004 87.999996 C 91.666671 87.999996 95.000004 91.333329 95.000004 97.999996 C 95.000004 104.666663 91.666671 107.999997 85.000004 107.999997 Z M 85.000004 87.999996 "
|
||||
transform="matrix(0, 0.75, -0.75, 0, 140.999994, 6)"
|
||||
id="path83" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 90.000004 103.000004 L 89.828129 119.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path85" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 92.802087 122.000005 C 92.802087 122.395838 92.723962 122.781255 92.572921 123.145838 C 92.421879 123.51563 92.203129 123.838547 91.921879 124.119797 C 91.640629 124.401047 91.317712 124.619797 90.94792 124.770839 C 90.578129 124.92188 90.19792 125.000005 89.802087 125.000005 C 89.401045 125.000005 89.020837 124.92188 88.651045 124.770839 C 88.286462 124.619797 87.958337 124.401047 87.677087 124.119797 C 87.395837 123.838547 87.182295 123.51563 87.026045 123.145838 C 86.875004 122.781255 86.802087 122.395838 86.802087 122.000005 C 86.802087 121.604172 86.875004 121.218755 87.026045 120.854172 C 87.182295 120.48438 87.395837 120.161463 87.677087 119.880213 C 87.958337 119.598963 88.286462 119.380213 88.651045 119.229172 C 89.020837 119.07813 89.401045 119.000005 89.802087 119.000005 C 90.19792 119.000005 90.578129 119.07813 90.94792 119.229172 C 91.317712 119.380213 91.640629 119.598963 91.921879 119.880213 C 92.203129 120.161463 92.421879 120.48438 92.572921 120.854172 C 92.723962 121.218755 92.802087 121.604172 92.802087 122.000005 Z M 92.802087 122.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path87" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(96.078491%, 96.078491%, 96.078491%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 190.000008 122.000005 L 270.000011 122.000005 L 270.000011 162.000007 L 190.000008 162.000007 Z M 190.000008 122.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path89" />
|
||||
<g
|
||||
fill="#333333"
|
||||
fill-opacity="1"
|
||||
id="g95">
|
||||
<use
|
||||
xlink:href="#glyph-0-7"
|
||||
x="165"
|
||||
y="111.74999"
|
||||
id="use91" />
|
||||
<use
|
||||
xlink:href="#glyph-0-8"
|
||||
x="172.5"
|
||||
y="111.74999"
|
||||
id="use93" />
|
||||
</g>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(96.078491%, 96.078491%, 96.078491%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 240.00001 112.000005 L 260.000011 112.000005 L 260.000011 122.000005 L 240.00001 122.000005 Z M 240.00001 112.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path97" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(96.078491%, 96.078491%, 96.078491%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 205.000005 116.999991 C 211.666672 116.999991 215.000006 120.333324 215.000006 126.999991 C 215.000006 133.666658 211.666672 136.999992 205.000005 136.999992 Z M 205.000005 116.999991 "
|
||||
transform="matrix(0, 0.75, -0.75, 0, 252.749989, -62.249997)"
|
||||
id="path99" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 210.000009 162.000007 L 210.000009 182.000008 L 250.00001 182.000008 L 250.00001 170.23959 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path101" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 250.00001 164.23959 L 254.000011 172.239591 L 250.00001 170.23959 L 246.00001 172.239591 Z M 250.00001 164.23959 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path103" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(96.078491%, 96.078491%, 96.078491%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 230.00001 76.000003 C 230.00001 77.312503 229.869801 78.614587 229.614593 79.901045 C 229.359385 81.187503 228.979176 82.442712 228.479176 83.656253 C 227.973968 84.864587 227.359384 86.020837 226.630218 87.109379 C 225.901051 88.203129 225.072926 89.213545 224.140634 90.140629 C 223.213551 91.07292 222.203134 91.901045 221.109384 92.630212 C 220.020843 93.359379 218.864592 93.973962 217.656259 94.479171 C 216.442717 94.979171 215.187509 95.359379 213.901051 95.614587 C 212.614592 95.869796 211.312509 96.000004 210.000009 96.000004 C 208.687509 96.000004 207.385425 95.869796 206.098967 95.614587 C 204.812509 95.359379 203.5573 94.979171 202.343758 94.479171 C 201.135425 93.973962 199.979175 93.359379 198.890633 92.630212 C 197.796883 91.901045 196.786467 91.07292 195.859383 90.140629 C 194.927091 89.213545 194.098966 88.203129 193.3698 87.109379 C 192.640633 86.020837 192.02605 84.864587 191.520841 83.656253 C 191.020841 82.442712 190.640633 81.187503 190.385425 79.901045 C 190.130216 78.614587 190.000008 77.312503 190.000008 76.000003 C 190.000008 74.687503 190.130216 73.38542 190.385425 72.098961 C 190.640633 70.812503 191.020841 69.557295 191.520841 68.343753 C 192.02605 67.135419 192.640633 65.979169 193.3698 64.890628 C 194.098966 63.796878 194.927091 62.786461 195.859383 61.859378 C 196.786467 60.927086 197.796883 60.098961 198.890633 59.369794 C 199.979175 58.640627 201.135425 58.026044 202.343758 57.520836 C 203.5573 57.020836 204.812509 56.640627 206.098967 56.385419 C 207.385425 56.130211 208.687509 56.000002 210.000009 56.000002 C 211.312509 56.000002 212.614592 56.130211 213.901051 56.385419 C 215.187509 56.640627 216.442717 57.020836 217.656259 57.520836 C 218.864592 58.026044 220.020843 58.640627 221.109384 59.369794 C 222.203134 60.098961 223.213551 60.927086 224.140634 61.859378 C 225.072926 62.786461 225.901051 63.796878 226.630218 64.890628 C 227.359384 65.979169 227.973968 67.135419 228.479176 68.343753 C 228.979176 69.557295 229.359385 70.812503 229.614593 72.098961 C 229.869801 73.38542 230.00001 74.687503 230.00001 76.000003 Z M 230.00001 76.000003 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path105" />
|
||||
<g
|
||||
fill="#333333"
|
||||
fill-opacity="1"
|
||||
id="g111">
|
||||
<use
|
||||
xlink:href="#glyph-0-5"
|
||||
x="150"
|
||||
y="62.249996"
|
||||
id="use107" />
|
||||
<use
|
||||
xlink:href="#glyph-0-6"
|
||||
x="157.5"
|
||||
y="62.249996"
|
||||
id="use109" />
|
||||
</g>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(96.078491%, 96.078491%, 96.078491%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 205.000004 87.999991 C 211.666671 87.999991 215.000004 91.333324 215.000004 97.999991 C 215.000004 104.666658 211.666671 107.999992 205.000004 107.999992 Z M 205.000004 87.999991 "
|
||||
transform="matrix(0, 0.75, -0.75, 0, 230.99999, -83.999997)"
|
||||
id="path113" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 210.000009 103.000004 L 209.828134 119.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path115" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 212.802092 122.000005 C 212.802092 122.395838 212.723967 122.781255 212.572926 123.145838 C 212.421884 123.51563 212.203134 123.838547 211.921884 124.119797 C 211.640634 124.401047 211.317717 124.619797 210.947925 124.770839 C 210.578134 124.92188 210.197925 125.000005 209.802092 125.000005 C 209.40105 125.000005 209.020842 124.92188 208.65105 124.770839 C 208.286467 124.619797 207.958342 124.401047 207.677092 124.119797 C 207.395842 123.838547 207.1823 123.51563 207.02605 123.145838 C 206.875009 122.781255 206.802092 122.395838 206.802092 122.000005 C 206.802092 121.604172 206.875009 121.218755 207.02605 120.854172 C 207.1823 120.48438 207.395842 120.161463 207.677092 119.880213 C 207.958342 119.598963 208.286467 119.380213 208.65105 119.229172 C 209.020842 119.07813 209.40105 119.000005 209.802092 119.000005 C 210.197925 119.000005 210.578134 119.07813 210.947925 119.229172 C 211.317717 119.380213 211.640634 119.598963 211.921884 119.880213 C 212.203134 120.161463 212.421884 120.48438 212.572926 120.854172 C 212.723967 121.218755 212.802092 121.604172 212.802092 122.000005 Z M 212.802092 122.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path117" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g133">
|
||||
<use
|
||||
xlink:href="#glyph-1-1"
|
||||
x="44.226562"
|
||||
y="23.999998"
|
||||
id="use119" />
|
||||
<use
|
||||
xlink:href="#glyph-1-2"
|
||||
x="51.734615"
|
||||
y="23.999998"
|
||||
id="use121" />
|
||||
<use
|
||||
xlink:href="#glyph-1-3"
|
||||
x="59.242672"
|
||||
y="23.999998"
|
||||
id="use123" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="66.750732"
|
||||
y="23.999998"
|
||||
id="use125" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="78.754395"
|
||||
y="23.999998"
|
||||
id="use127" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="87.000732"
|
||||
y="23.999998"
|
||||
id="use129" />
|
||||
<use
|
||||
xlink:href="#glyph-1-1"
|
||||
x="90.751457"
|
||||
y="23.999998"
|
||||
id="use131" />
|
||||
</g>
|
||||
<g
|
||||
clip-path="url(#clip-0)"
|
||||
id="g137">
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="#000000"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="m 110.00001,201.00001 -0.23959,-29"
|
||||
transform="matrix(0.75,0,0,0.75,0.375,0.375)"
|
||||
id="path135" />
|
||||
</g>
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(72.158813%, 32.939148%, 31.369019%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 90.000004 172.000007 L 130.000005 172.000007 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path139" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 416 KiB After Width: | Height: | Size: 416 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,377 @@
|
||||
# Linux Networking
|
||||
|
||||
## Interface LEGO®
|
||||
|
||||

|
||||
|
||||
| **Type** | **Yang Model** | **Description** |
|
||||
| -------- | ----------------- | ------------------------------------------------------------- |
|
||||
| bridge | infix-if-bridge | SW implementation of an IEEE 802.1Q bridge |
|
||||
| ip | ietf-ip, infix-ip | IP address to the subordinate interface |
|
||||
| vlan | infix-if-vlan | Capture all traffic belonging to a specific 802.1Q VID |
|
||||
| lag[^1] | infix-if-lag | Bonds multiple interfaces into one, creating a link aggregate |
|
||||
| lo | ietf-interfaces | Software loopback interface |
|
||||
| eth | ietf-interfaces | Physical Ethernet device/port |
|
||||
| veth | infix-if-veth | Virtual Ethernet pair, typically one end is in a container |
|
||||
|
||||
## Data Plane
|
||||
|
||||
The blocks you ctose, and how you connect them, defines your data plane. Here we see an example of how to bridge a virtual port with a physical LAN.
|
||||
|
||||

|
||||
|
||||
Depending on the (optional) VLAN filtering of the bridge, the container may have full or limited connectivity with outside ports, as well as the internal CPU.
|
||||
|
||||
In fact the virtual port connected to the bridge can be member of several VLANs, with each VLAN being an interface with an IP address inside the container.
|
||||
|
||||
Thanks to Linux, and technologies like switchdev, that allow you to split a switching fabric into unique (isolated) ports, the full separation and virtualization of all Ethernet layer properties are possible to share with a container. Meaning, all the building blocks used on the left hand side can also be used freely on the right hand side as well.
|
||||
|
||||
### Bridging
|
||||
|
||||
This is the most central part of the system. A bridge is a switch, and a switch is a bridge. In Linux, setting up a bridge with ports connected to physical switch fabric, means you manage the actual switch fabric!
|
||||
|
||||
In Infix ports are by default not switch ports, unless the customer specific factory config sets it up this way. To enable switching between ports you create a bridge and then add ports to that bridge. That's it.
|
||||
|
||||
```
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interface br0
|
||||
admin@example:/config/interface/br0/> up
|
||||
admin@example:/config/> set interface eth0 bridge-port bridge br0
|
||||
admin@example:/config/> set interface eth1 bridge-port bridge br0
|
||||
admin@example:/config/> leave
|
||||
```
|
||||
|
||||
Here we add two ports to bridge `br0`: `eth0` and `eth1`.
|
||||
|
||||
> **Note:** Infix has many built-in helpers controlled by convention. E.g., if you name your bridge `brN`, where `N` is a number, Infix will set the interface type automatically for you, and unlock all bridge features for you.
|
||||
|
||||
#### VLAN Filtering Bridge
|
||||
|
||||
By default bridges in Linux do not filter based on VLAN tags. It can be enabled in Infix when creating a bridge by adding a port to a VLAN as a tagged or untagged member.
|
||||
Use the port default VID (PVID) setting to control VLAN association for traffic ingressing a port untagged (default PVID: 1).
|
||||
|
||||
```
|
||||
admin@example:/config/> edit interface br0
|
||||
admin@example:/config/interface/br0/> up
|
||||
admin@example:/config/> set interface eth0 bridge-port bridge br0
|
||||
admin@example:/config/> set interface eth0 bridge-port pvid 10
|
||||
admin@example:/config interface eth1 bridge-port bridge br0
|
||||
admin@example:/config/> set interface eth1 bridge-port pvid 20
|
||||
admin@example:/config/> edit interface br0
|
||||
admin@example:/config/interface/br0/> set bridge vlans vlan 10 untagged eth0
|
||||
admin@example:/config/interface/br0/> set bridge vlans vlan 20 untagged eth1
|
||||
```
|
||||
|
||||
This sets `eth0` as an untagged member of VLAN 10 and `eth1` as an
|
||||
untagged member of VLAN 20. Switching between these ports is thus
|
||||
prohibited.
|
||||
|
||||
To terminate a VLAN in the switch itself, either for switch management or for routing, the bridge must become a (tagged) member of the VLAN.
|
||||
|
||||
```
|
||||
admin@example:/config/interface/br0/> set bridge vlans vlan 10 tagged br0
|
||||
admin@example:/config/interface/br0/> set bridge vlans vlan 20 tagged br0
|
||||
```
|
||||
> To route or to manage via a VLAN, a VLAN interface also needs to be created on top of the bridge, see section [VLAN Interfaces](#vlan-interfaces) below.
|
||||
|
||||
### VLAN Interfaces
|
||||
|
||||
Creating a VLAN can be done in many ways. This section assumes VLAN interfaces created atop another Linux interface. E.g., the VLAN interfaces created on top of the Ethernet interface or bridge in the picture below.
|
||||
|
||||

|
||||
|
||||
A VLAN interface is basically a filtering abstraction. When you run `tcpdump` on a VLAN interface you will only see the frames matching the VLAN ID of the interface, compared to *all* the VLAN IDs if you run `tcpdump` on the lower-layer interface.
|
||||
|
||||
```
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interface eth0.20
|
||||
admin@example:/config/interface/eth0.20/> set vlan id 20
|
||||
admin@example:/config/interface/eth0.20/> set vlan lower-layer-if eth0
|
||||
admin@example:/config/interface/eth0.20/> leave
|
||||
```
|
||||
|
||||
The example below assumes bridge br0 is already created, see [VLAN Filtering Bridge](#vlan-filtering-bridge).
|
||||
|
||||
```
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interface vlan10
|
||||
admin@example:/config/interface/vlan10/> set vlan id 10
|
||||
admin@example:/config/interface/vlan10/> set vlan lower-layer-if br0
|
||||
admin@example:/config/interface/vlan10/> leave
|
||||
```
|
||||
|
||||
As conventions, a VLAN interface for VID 20 on top of an Ethernet interface *eth0* is named *eth0.20*, and a VLAN interface for VID 10 on top of a bridge interface *br0* is named *vlan10*.
|
||||
|
||||
> **Note:** If you name your VLAN interface `foo0.N` or `vlanN`, where `N` is a number, Infix will set the interface type automatically for you.
|
||||
|
||||
## Management Plane
|
||||
|
||||
This section details IP Addresses And Other Per-Interface IP settings.
|
||||
|
||||
Infix support several network interface types, each can be assigned one or more IP addresses, both IPv4 and IPv6 are supported.
|
||||
|
||||

|
||||
|
||||
### IPv4 Address Assignment
|
||||
|
||||
Multiple address assignment methods are available:
|
||||
|
||||
| **Type** | **Yang Model** | **Description** |
|
||||
|:---------- |:----------------- |:-------------------------------------------------------------- |
|
||||
| static | ietf-ip | Static assignment of IPv4 address, e.g., *10.0.1.1/24* |
|
||||
| link-local | infix-ip | Auto-assignment of IPv4 address in 169.254.x.x/16 range |
|
||||
| dhcp | infix-dhcp-client | Assignment of IPv4 address by DHCP server, e.g., *10.0.1.1/24* |
|
||||
|
||||
DHCP address method is only available for *LAN* interfaces (ethernet, virtual ethernet (veth), bridge, etc.)
|
||||
|
||||
### IPv6 Address Assignment
|
||||
|
||||
Multiple address assignment methods are available:
|
||||
|
||||
| **Type** | **Yang Model** | **Description** |
|
||||
|:---------------- |:-------------- |:------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| static | ietf-ip | Static assignment of IPv6 address, e.g., *2001:db8:0:1::1/64* |
|
||||
| link-local | ietf-ip[^2] | (RFC4862) Auto-configured link-local IPv6 address (*fe80::0* prefix + interface identifier, e.g., *fe80::ccd2:82ff:fe52:728b/64*) |
|
||||
| global auto-conf | ietf-ip | (RFC4862) Auto-configured (stateless) global IPv6 address (prefix from router + interface identifier, e.g., *2001:db8:0:1:ccd2:82ff:fe52:728b/64* |
|
||||
|
||||
Both for *link-local* and *global auto-configuration*, it is possible
|
||||
to auto-configure using a random suffix instead of the interface
|
||||
identifier.
|
||||
|
||||
|
||||
### Examples
|
||||
|
||||

|
||||
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
|
||||
To illustrate IP address configuration, the examples below uses a
|
||||
switch with a single Ethernet interface (eth0) and a loopback
|
||||
interface (lo). As shown above, these examples assume *eth0* has an
|
||||
IPv6 link-local address and *lo* has static IPv4 and IPv6 addresses by
|
||||
default.
|
||||
|
||||
#### Static and link-local IPv4 addresses
|
||||
|
||||

|
||||
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interface eth0 ipv4
|
||||
admin@example:/config/interface/eth0/ipv4/> set address 10.0.1.1 prefix-length 24
|
||||
admin@example:/config/interface/eth0/ipv4/> set autoconf enabled true
|
||||
admin@example:/config/interface/eth0/ipv4/> diff
|
||||
+interfaces {
|
||||
+ interface eth0 {
|
||||
+ ipv4 {
|
||||
+ address 10.0.1.1 {
|
||||
+ prefix-length 24;
|
||||
+ }
|
||||
+ autoconf {
|
||||
+ enabled true;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
admin@example:/config/interface/eth0/ipv4/> leave
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv4 169.254.1.3/16 (random)
|
||||
ipv4 10.0.1.1/24 (static)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
|
||||
As shown, the link-local IPv4 address is configured with `set autconf
|
||||
enabled true`. The resulting address (169.254.1.3/16) is of type
|
||||
*random* ([IETF ip-yang][ietf-ip-yang]).
|
||||
|
||||
#### Use of DHCP for IPv4 address assignment
|
||||
|
||||

|
||||
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit dhcp-client
|
||||
admin@example:/config/dhcp-client/> set client-if eth0
|
||||
admin@example:/config/dhcp-client/> set enabled true
|
||||
admin@example:/config/dhcp-client/> leave
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv4 10.1.2.100/24 (dhcp)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
|
||||
The resulting address (10.1.2.100/24) is of type *dhcp*.
|
||||
|
||||
|
||||
#### Disabling IPv6 link-local address(es)
|
||||
|
||||
The (only) way to disable IPv6 link-local addresses is by disabling IPv6 on the interface.
|
||||
|
||||
```(disabling
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interface eth0 ipv6
|
||||
admin@example:/config/interface/eth0/ipv6/> set enabled false
|
||||
admin@example:/config/interface/eth0/ipv6/> leave
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
```
|
||||
|
||||
#### Static IPv6 address
|
||||
|
||||

|
||||
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interface eth0 ipv6
|
||||
admin@example:/config/interface/eth0/ipv6/> set address 2001:db8::1 prefix-length 64
|
||||
admin@example:/config/interface/eth0/ipv6/> leave
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8::1/64 (static)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
|
||||
#### Stateless Auto-configuration of Global IPv6 Address
|
||||
|
||||

|
||||
|
||||
Stateless address auto-configuration of global addresses is enabled by
|
||||
default. The address is formed by concatenating the network prefix
|
||||
advertised by the router (here 2001:db8:0:1::0/64) and the interface
|
||||
identifier. The resulting address is of type *link-layer*, as it
|
||||
is formed based on the interface identifier ([IETF
|
||||
ip-yang][ietf-ip-yang]).
|
||||
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8:0:1:0:ff:fe00:0/64 (link-layer)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
|
||||
Disabling auto-configuration of global IPv6 addresses can be done as shown
|
||||
below.
|
||||
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interface eth0 ipv6
|
||||
admin@example:/config/interface/eth0/ipv6/> set autoconf create-global-addresses false
|
||||
admin@example:/config/interface/eth0/ipv6/> leave
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
|
||||
#### Random Link Identifiers for IPv6 Stateless Autoconfiguration
|
||||
|
||||

|
||||
|
||||
By default, the auto-configured link-local and global IPv6 addresses
|
||||
are formed from a link-identifier based on the MAC address.
|
||||
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8:0:1:0:ff:fe00:0/64 (link-layer)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
|
||||
To avoid revealing identity information in the IPv6 address, it is
|
||||
possible to specify use of a random identifier ([ietf-ip][ietf-ip-yang] YANG and [RFC8981][ietf-ipv6-privacy]).
|
||||
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interface eth0 ipv6
|
||||
admin@example:/config/interface/eth0/ipv6/> set autoconf create-temporary-addresses true
|
||||
admin@example:/config/interface/eth0/ipv6/> leave
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8:0:1:b705:8374:638e:74a8/64 (random)
|
||||
ipv6 fe80::ad3d:b274:885a:9ffb/64 (random)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
|
||||
Both the link-local address (fe80::) and the global address (2001:)
|
||||
have changed type to *random*.
|
||||
|
||||
## Routing support
|
||||
|
||||
| **Yang Model** | **Description** |
|
||||
|:--------------------------|:----------------------------------------------------------|
|
||||
| ietf-routing | Base routing model, required for all other routing models |
|
||||
| ietf-ipv4-unicast-routing | Static IPv4 unicast routing |
|
||||
|
||||
### Static routes
|
||||
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit routing control-plane-protocol static name default
|
||||
admin@example:/config/routing/control-plane-protocol/static/name/default/> set ipv4 route 192.168.200.0/24 next-hop next-hop-address 192.168.1.1
|
||||
admin@example:/config/routing/control-plane-protocol/static/name/default/> leave
|
||||
admin@example:/>
|
||||
|
||||
> **Note:** The only name allowed for a control-plane-protocol is currently
|
||||
> *default*. Meaning, you can only have one instance per routing protocol.
|
||||
|
||||
### View IPv4 routing table
|
||||
|
||||
The routing table can be viewed from the operational datastore over
|
||||
NETCONF or using the CLI:
|
||||
|
||||
admin@example:/> show routes
|
||||
PREFIX NEXT-HOP METRIC PROTOCOL
|
||||
192.168.1.0/24 e0 kernel
|
||||
192.168.200.0/24 192.168.1.1 20 static
|
||||
|
||||
The source protocol describes the origin of the route.
|
||||
|
||||
| **Protocol** | **Description** |
|
||||
|:-------------|:---------------------------------------------------------------------|
|
||||
| kernel | Added when setting a subnet address on an interface |
|
||||
| static | User created static routes |
|
||||
| dhcp | Routes retrieved from DHCP |
|
||||
|
||||
The YANG model *ietf-routing* support multiple ribs but only two are
|
||||
currently supported, namely `ipv4` and `ipv6`.
|
||||
|
||||
[ietf-ip-yang]: https://www.rfc-editor.org/rfc/rfc8344.html
|
||||
[ietf-ipv6-privacy]: https://www.rfc-editor.org/rfc/rfc8981.html
|
||||
|
||||
[^1]: Please note, link aggregates are not yet supported in Infix.
|
||||
[^2]: Link-local IPv6 addresses are implicitly enabled when enabling IPv6.
|
||||
IPv6 can be enabled/disabled per interface in the [ietf-ip][ietf-ip-yang]
|
||||
YANG model.
|
||||
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
Package override
|
||||
================
|
||||
|
||||
This guide demonstrates how the `local.mk` file is utilized to override
|
||||
a Linux Buildroot package. The example of `tcpdump` serves to illustrate
|
||||
this process.
|
||||
|
||||
In an instance such as `Infix` using tcpdump, the `local.mk` file is modified
|
||||
as shown below:
|
||||
|
||||
```
|
||||
TCPDUMP_OVERRIDE_SRCDIR = /path/to/tcpdump/repo
|
||||
```
|
||||
|
||||
and stored in the `output/` folder, alongside the `.config` file:
|
||||
```
|
||||
user@PC:~/infix$ll output/ | grep -e 'local.mk' -e '.config'
|
||||
-rw-r--r-- 1 group user 119936 Nov 10 18:04 .config
|
||||
-rw-r--r-- 1 group user 43 Nov 10 18:25 local.mk
|
||||
```
|
||||
|
||||
The execution of `make tcpdump-rebuild all` triggers a process where
|
||||
Buildroot synchronizes the tcpdump source code from the specified override directory
|
||||
to `output/build/tcpdump-custom`, followed by the rebuilding of the entire project.
|
||||
|
||||
```
|
||||
user@PC:~/infix$ make tcpdump-rebuild all
|
||||
```
|
||||
|
||||
|
||||
```
|
||||
user@PC:~/infix$ ll /output/build/ | grep tcpdump
|
||||
drwxr-xr-x 7 group user 20480 Nov 10 18:26 tcpdump-4.99.4/
|
||||
drwxr-xr-x 7 group user 12288 Nov 10 18:28 tcpdump-custom/
|
||||
```
|
||||
|
||||
Buildroot follows a process of downloading and processing tarballs
|
||||
(extraction, configuration, compilation, and installation).
|
||||
The source code is stored in a temporary directory:
|
||||
`output/build/<package>-<version>` (i.e. `tcpdump-4.99.4/`),
|
||||
which is removed and recreated with each `make` command. That is why
|
||||
the direct modifications in the `output/build` directory are generally
|
||||
**not recommended**.
|
||||
|
||||
To manage the development changes more effectively, where the package source code
|
||||
remains untouched, Buildroot incorporates the `<pkg>_OVERRIDE_SRCDIR` feature.
|
||||
|
||||
For a comprehensive understanding of utilizing Buildroot during development,
|
||||
including detailed elaboration on the `<pkg>_OVERRIDE_SRCDIR` feature,
|
||||
refer to section 8.13.6 in [Using Buildroot during development](https://nightly.buildroot.org/).
|
||||