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 [2345] <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,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 proto 17 ||:
|
||||
;;
|
||||
|
||||
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
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
17 zeroconf
|
||||
@@ -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 |