Compare commits

...

10 Commits

Author SHA1 Message Date
2074154f71 tasks 2024-04-21 21:35:32 -07:00
3063c64115 PreVerify body 2024-04-09 12:36:43 -07:00
b65bf9f639 PreVerify 2024-04-09 12:33:14 -07:00
7cf1d5771f meslvec0004 2024-02-28 13:13:35 -07:00
94b788a47b Downgrade to net6.0 and add yml 2024-01-30 18:12:50 -07:00
9630600144 net8.0 2023-11-28 07:15:40 -07:00
e94f279144 kanban 2023-10-19 22:29:29 -07:00
b985898ab2 remove appsettings 2023-10-19 22:28:40 -07:00
9a525b44cc apt-get 2023-08-04 14:00:50 -07:00
c0cbf05a5a user-secrets 2023-08-04 13:56:07 -07:00
44 changed files with 968 additions and 1354 deletions

2
.gitignore vendored
View File

@ -347,3 +347,5 @@ Server/wwwroot/js/chat.js
Server/Hubs/ChatHub.cs
Server/Pages/Chat.cshtml
Server/Pages/Chat.cshtml.cs
.kanbn

View File

@ -1,28 +0,0 @@
.kanbn-column-wip .kanbn-column-task-list {
border-color: #6929c4;
}
.kanbn-column-next .kanbn-column-task-list {
border-color: #1192e8;
}
.kanbn-column-wait .kanbn-column-task-list {
border-color: #005d5d;
}
.kanbn-column-later .kanbn-column-task-list {
border-color: #9f1853;
}
.kanbn-column-maybe .kanbn-column-task-list {
border-color: #fa4d56;
}
.kanbn-column-friday .kanbn-column-task-list {
border-color: #570408;
}
.kanbn-column-done .kanbn-column-task-list {
border-color: #198038;
}
.kanbn-task-data-workload {
display: none;
}
.kanbn-task-data-relation {
display: block;
color: #198038;
}

View File

@ -1,43 +0,0 @@
---
startedColumns:
- "In Progress"
completedColumns:
- Done
dateFormat: mm/dd
---
# Barcode-Host
## Backlog
- [apt-get-install](tasks/apt-get-install.md)
- [netplan](tasks/netplan.md)
## Todo
- [epi-pro-scan](tasks/epi-pro-scan.md)
## In Progress
- [azure-pipeline](tasks/azure-pipeline.md)
- [update-os](tasks/update-os.md)
- [self-signed-certificate](tasks/self-signed-certificate.md)
- [roll-out](tasks/roll-out.md)
- [publish](tasks/publish.md)
- [post-only-once](tasks/post-only-once.md)
## Done
- [setup-nginx](tasks/setup-nginx.md)
- [run-test-ports](tasks/run-test-ports.md)
- [run-secrets-task](tasks/run-secrets-task.md)
- [pull-repo](tasks/pull-repo.md)
- [install-vscode-extensions](tasks/install-vscode-extensions.md)
- [install-ubuntu-frame](tasks/install-ubuntu-frame.md)
- [install-net-7-0](tasks/install-net-7-0.md)
- [create-as-service](tasks/create-as-service.md)
- [configure-ufw](tasks/configure-ufw.md)
## Archive
- [signalr](tasks/signalr.md)

View File

@ -1,77 +0,0 @@
---
status: "1-Backlog"
created: "2023-06-23T22:41:35.812Z"
updated: "2023-07-27T18:05:52.706Z"
type: "kanbn"
---
# apt-get-install
```bash
sudo -i
apt-get install links unzip net-tools ufw nginx git -y
```
```bash
# Checking your Ubuntu Version
lsb_release -a
# There are several good, effective answers listed above.
# However, this is the mechanism I personally use -- apt-ftparchive.
# I'm documenting it here, in case I need it again in the future. Perhaps it might be useful to you.
# Creating the Archive Snapshot
# Create an instance of Ubuntu that closely mimics the target environment
# For example, an Ubuntu 12.04 64-bit instance in Amazon
# Start with a clean package environment
apt-get clean
# Update the package lists
apt-get update
# Download all package updates available
apt-get dist-upgrade --download-only
# recursive-dependencies-of-a-debian-package
apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances smbclient | grep "^\w" | sort -u
# Download all relevant packages and dependencies
apt-get install --download-only byobu run-one bikeshed dotdee powernap
apt-get install --download-only --reinstall e2fsprogs fwupd grub-common libcups2 libglib2.0-0 netplan.io python3-systemd rsyslog smbclient
apt-get install --download-only --reinstall cdebconf coreutils debconf dpkg e2fsprogs fwupd gcc-10-base grub-common install-info libacl1 libarchive13 libasn1-8-heimdal libattr1 libaudit-common libaudit1 libavahi-client3 libavahi-common-data libavahi-common3 libbsd0 libbz2-1.0 libc6 libcap-ng0 libcap2 libcom-err2 libcrypt1 libcups2 libdb5.3 libdbus-1-3 libdebian-installer4 libexpat1 libffi7 libfuse2 libgcc-s1 libgcrypt20 libglib2.0-0 libgmp10 libgnutls30 libgpg-error0 libgssapi-krb5-2 libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal libheimntlm0-heimdal libhogweed5 libhx509-5-heimdal libicu66 libidn2-0 libjansson4 libk5crypto3 libkeyutils1 libkrb5-26-heimdal libkrb5-3 libkrb5support0 libldap-2.4-2 libldap-common libldb2 liblmdb0 liblz4-1 liblzma5 libmpdec2 libncursesw6 libnetplan0 libnettle7 libnewt0.52 libp11-kit0 libpam0g libpcre2-8-0 libpopt0 libpython3-stdlib libpython3.8 libpython3.8-minimal libpython3.8-stdlib libreadline8 libroken18-heimdal libsasl2-2 libsasl2-modules-db libselinux1 libslang2 libsmbclient libsqlite3-0 libssl1.1 libstdc++6 libsystemd0 libtalloc2 libtasn1-6 libtdb1 libtevent0 libtextwrap1 libtinfo6 libtss2-esys0 libunistring2 libuuid1 libwbclient0 libwind0-heimdal libxml2 libzstd1 mime-support netplan.io perl-base python3 python3-ldb python3-minimal python3-systemd python3-talloc python3.8 python3.8-minimal readline-common rsyslog samba-common samba-libs sensible-utils smbclient tar tzdata ucf zlib1g
# Create the package manifest
(cd /var/cache/apt/archives/ && apt-ftparchive packages . ) | tee /var/cache/apt/archives/Packages
ls /var/cache/apt/archives
# Create an archive of the packages
cd /home/unity4
tar cvf snapshot.tar -C /var/cache/apt archives/
ls /home/unity4
```
```bash
scp unity4@unity4:/home/unity4/snapshot.tar D:/Tmp/Phares/snapshot.tar
```
```bash
pscp D:/Tmp/Phares/snapshot.tar unity5@unity5:/home/unity5/snapshot.tar
```
```bash
# Using the Archive Snapshot on the Offline Target System
# Through some mechanism, you will need to get the snapshot.tar from the source to the target system.
# Perhaps on a USB stick, or otherwise.
# Extract the archive on the target system (in this case, in /home/ubuntu)
cd /home/unity5
tar xvf snapshot.tar
cd /home/unity5/archives
ls /home/unity5/archives
dpkg -i *.deb
dpkg -i smbclient_2%3a4.15.13+dfsg-0ubuntu0.20.04.2_amd64.deb
# Add the local, offline source to /etc/apt/sources.list
echo "deb file:/home/unity5/archives /" | tee -a /etc/apt/sources.list
# Update the package list
apt-get update
# Install the packages as desired
apt-get install byobu run-one bikeshed dotdee powernap
apt-get install smbclient
```
## Sub-tasks
- [x] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,59 +0,0 @@
---
created: "2023-07-27T18:04:46.640Z"
updated: "2023-07-27T18:05:52.731Z"
assigned: ""
progress: 0
started: "2023-07-27T18:04:48.076Z"
status: "3-In Progress"
type: "kanbn"
---
# Azure Pipeline
```bash
apt install putty-tools
pscp D:/Tmp/phares/ag/vsts-agent-linux-x64-2.210.1.tar.gz unity4@unity4:/home/unity4/vsts-agent-linux-x64-2.210.1.tar.gz
pscp D:/Tmp/phares/ag/vsts-agent-linux-x64-2.210.1.tar.gz unity5@unity5:/home/unity5/vsts-agent-linux-x64-2.210.1.tar.gz
pscp D:/Tmp/phares/ag/vsts-agent-linux-x64-2.210.1.tar.gz room006@mescroom006:/home/room006/vsts-agent-linux-x64-2.210.1.tar.gz
```
```bash
apt-get install libicu66
mv vsts-agent-linux-x64-2.210.1.tar.gz vsts-agent-linux-x64-2.210.1-unity4
mkdir vsts-agent-linux-x64-2.210.1-unity4
cd vsts-agent-linux-x64-2.210.1-unity4
tar xvzf vsts-agent-linux-x64-2.210.1.tar.gz
chown unity4 /home/unity4/vsts-agent-linux-x64-2.210.1-unity4 -R
chgrp unity4 /home/unity4/vsts-agent-linux-x64-2.210.1-unity4 -R
./config.sh --url https://tfs.intra.infineon.com/tfs/manufacturingit --pool Mesa-Linux --auth negotiate --userName infineon@phares
./config.sh --url https://tfs.intra.infineon.com/tfs/manufacturingit --pool Mesa-Linux --auth pat --token asdf
```
```bash
sudo -i
echo >/etc/systemd/system/vsts-agent-linux.service && nano /etc/systemd/system/vsts-agent-linux.service
```
```conf
[Unit]
Description=vsts-agent-linux
After=multi-user.target
[Service]
User=unity4
WorkingDirectory= /home/unity4/vsts-agent-linux-x64-2.210.1-unity4
ExecStart=/home/unity4/vsts-agent-linux-x64-2.210.1-unity4/run.sh
Restart=always
[Install]
WantedBy=multi-user.target
```
```bash
systemctl daemon-reload
systemctl enable vsts-agent-linux.service
systemctl start vsts-agent-linux.service
systemctl status vsts-agent-linux.service
systemctl stop vsts-agent-linux.service
journalctl -fu vsts-agent-linux.service
journalctl --rotate
journalctl --vacuum-time=1s
```

View File

@ -1,78 +0,0 @@
---
status: "4-Done"
created: "2023-07-25T17:31:10.375Z"
updated: "2023-07-27T18:05:52.733Z"
type: "kanbn"
---
# configure-ufw
```bash
sudo -i
ufw allow from 192.168.0.0/24 to any port 22 comment "01) SSH"
ufw allow to 0.0.0.0/0 port 80 comment "02) HTTP"
ufw allow to 0.0.0.0/0 port 443 comment "03) HTTPS"
ufw allow to 0.0.0.0/0 port 9418 comment "04) Git"
ufw allow from 192.168.0.0/24 to any port 8005 comment "05) Pi-hole"
ufw allow from 192.168.0.0/24 to any port 8006 comment "06) Ajenti"
ufw allow from 192.168.0.0/24 to any port 8007 comment "07) code-server"
ufw allow from 192.168.0.0/24 to any port 8008 comment "08) Nginx"
ufw allow from 192.168.0.0/24 to any port 5002 comment "09) BaGet"
ufw allow to 0.0.0.0/0 port 5000 comment "10) .netCore"
ufw allow to 0.0.0.0/0 port 5001 comment "11) .netCore"
ufw allow from 192.168.0.0/24 to any port 53 comment "12) DNS"
ufw allow from 192.168.0.0/24 to any port 67 comment "13) Unknown"
ufw allow from 192.168.0.0/24 to any port 9654 comment "14) barcode-server"
ufw allow from 192.168.0.0/24 to any port 8009 comment "15) barcode-server-statistics"
ufw allow from 0.0.0.0/0 to any port 9400 comment "16) dashkiosk"
ufw delete 16
ufw allow from 0.0.0.0/0 to any port 8010 comment "16) Test"
ufw allow from 0.0.0.0/0 to any port 5052 comment "17) NGINdeX.io"
ufw allow from 0.0.0.0/0 to any port 3000 comment "18) gogs"
ufw allow from 0.0.0.0/0 to any port 4001 comment "19) gogs"
ufw delete 19
ufw allow from 192.168.0.0/24 to any port 4001 comment "19) photoview api"
ufw allow from 192.168.0.0/24 to any port 1234 comment "20) photoview ui"
ufw allow from 192.168.0.0/24 to any port 3306 comment "21) mysql"
ufw allow from 192.168.0.0/24 to any port 8011 comment "22) syncthing"
ufw allow from 0.0.0.0/0 to any port 5201 comment "23) iperf3"
ufw enable
ufw status numbered
ufw disable
```
```conf
Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN 192.168.0.0/24 # 01) SSH
[ 2] 80 ALLOW IN Anywhere # 02) HTTP
[ 3] 443 ALLOW IN Anywhere # 03) HTTPS
[ 4] 9418 ALLOW IN Anywhere # 04) Git
[ 5] 8005 ALLOW IN 192.168.0.0/24 # 05) Pi-hole
[ 6] 8006 ALLOW IN 192.168.0.0/24 # 06) Ajenti
[ 7] 8007 ALLOW IN 192.168.0.0/24 # 07) code-server
[ 8] 8008 ALLOW IN 192.168.0.0/24 # 08) Nginx
[ 9] 5002 ALLOW IN 192.168.0.0/24 # 09) BaGet
[10] 5000 ALLOW IN Anywhere # 10) .netCore
[11] 5001 ALLOW IN Anywhere # 11) .netCore
[12] 53 ALLOW IN 192.168.0.0/24 # 12) DNS
[13] 67 ALLOW IN 192.168.0.0/24 # 13) Unknown
[14] 9654 ALLOW IN 192.168.0.0/24 # 14) barcode-server
[15] 8009 ALLOW IN 192.168.0.0/24 # 15) barcode-server-statistics
[16] 8010 ALLOW IN Anywhere # 16) Test
[17] 5052 ALLOW IN Anywhere # 17) NGINdeX.io
[18] 3000 ALLOW IN Anywhere # 18) gogs
[19] 4001 ALLOW IN 192.168.0.0/24 # 19) photoview api
[20] 1234 ALLOW IN 192.168.0.0/24 # 20) photoview ui
[21] 3306 ALLOW IN 192.168.0.0/24 # 21) mysql
[22] 8011 ALLOW IN 192.168.0.0/24 # 22) syncthing
[23] 5201 ALLOW IN Anywhere # 23) iperf3
```
## Sub-tasks
- [x] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,46 +0,0 @@
---
status: "4-Done"
created: "2023-06-06T02:52:34.344Z"
updated: "2023-07-27T18:05:52.738Z"
type: "kanbn"
---
# Create as Service
```bash
sudo -i
echo >/etc/systemd/system/barcode-host.service && nano /etc/systemd/system/barcode-host.service
```
```conf
[Unit]
Description=Barcode Server
After=multi-user.target
[Service]
User=unity4
WorkingDirectory=/var/www/Barcode-Host/Server
ExecStart=/usr/local/bin/dotnet /var/www/Barcode-Host/Server/Barcode.Host.Server.dll
Restart=always
# Environment=ASPNETCORE_ENVIRONMENT=Development
# Environment=ASPNETCORE_ENVIRONMENT=Staging
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
```
```bash
systemctl daemon-reload
systemctl enable barcode-host.service
systemctl start barcode-host.service
systemctl status barcode-host.service
systemctl stop barcode-host.service
journalctl -fu barcode-host.service
journalctl --rotate
journalctl --vacuum-time=1s
```
## Sub-tasks
- [ ] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,18 +0,0 @@
---
status: "2-Todo"
created: "2023-07-25T17:33:20.243Z"
updated: "2023-07-27T18:05:52.708Z"
type: "kanbn"
---
# epi-pro-scan
```bash
```
## Sub-tasks
- [ ] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,26 +0,0 @@
---
status: "4-Done"
created: "2023-06-06T02:52:34.346Z"
updated: "2023-07-27T18:05:52.739Z"
type: "kanbn"
---
# Install .net 7.0
```bask
# https://learn.microsoft.com/en-us/dotnet/core/install/linux-scripted-manual#scripted-install
cd /home/unity4
wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh
chmod +x ./dotnet-install.sh
./dotnet-install.sh --channel 7.0
export DOTNET_ROOT=$HOME/.dotnet
export PATH=$PATH:$HOME/.dotnet:$HOME/.dotnet/tools
ln -s /home/unity4/.dotnet/dotnet /usr/local/bin/dotnet
dotnet --info
```
## Sub-tasks
- [x] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,28 +0,0 @@
---
status: "4-Done"
created: "2023-06-06T02:52:34.347Z"
updated: "2023-07-27T18:05:52.740Z"
type: "kanbn"
---
# install-ubuntu-frame
```bash
apt-get install links unzip net-tools -y
snap install dashkiosk
timedatectl set-timezone America/Phoenix
snap restart dashkiosk
snap install ubuntu-frame wpe-webkit-mir-kiosk
snap set wpe-webkit-mir-kiosk daemon=true
snap set wpe-webkit-mir-kiosk url=http://localhost:9400/receiver
wpe-webkit-mir-kiosk.cog http://localhost:9400/receiver
/snap/wpe-webkit-mir-kiosk/current/bin/setup.sh
wpe-webkit-mir-kiosk.cog http://localhost:9400/receiver
snap set ubuntu-frame daemon=true
```
## Sub-tasks
- [ ] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,19 +0,0 @@
---
status: "4-Done"
created: "2023-06-06T02:52:34.348Z"
updated: "2023-07-27T18:05:52.741Z"
type: "kanbn"
---
# install-vscode-extensions
- .NET Watch Attach (trottero.dotnetwatchattach)
- C# (ms-dotnettools.csharp)
- Git Graph (mhutchie.git-graph)
- Live Preview (ms-vscode.live-server)
## Sub-tasks
- [x] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,99 +0,0 @@
---
status: "1-Backlog"
created: "2023-06-23T22:41:35.814Z"
updated: "2023-07-27T18:05:52.707Z"
type: "kanbn"
---
# netplan
```bash
ip link
```
```echo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 10
link/ether 6c:0b:84:e3:94:11 brd ff:ff:ff:ff:ff:ff
altname enp0s31f6
```
```bash
https://ubuntu.com/server/docs/network-configuration
ip a
ip address show eno1
echo >/etc/netplan/99_config.yaml && nano /etc/netplan/99_config.yaml
```
```bash
network:
version: 2
renderer: networkd
ethernets:
eno1:
addresses:
- 192.168.0.204/24
routes:
- to: default
via: 192.168.0.1
nameservers:
addresses: [192.168.0.1, 8.8.8.8, 4.4.4.4]
```
```bash
network:
version: 2
renderer: networkd
ethernets:
eno1:
addresses:
- 192.168.0.12/24
routes:
- to: default
via: 192.168.0.1
nameservers:
addresses: [192.168.0.1, 8.8.8.8, 4.4.4.4]
```
```bash
netplan apply
ip addr flush eno1
# soft reset
```
```bash
network:
version: 2
renderer: networkd
ethernets:
eno1:
addresses:
- 10.95.154.54/24
routes:
- to: default
via: 10.95.154.1
nameservers:
addresses: [10.95.128.11, 10.64.152.171, 8.8.8.8, 4.4.4.4]
```
```bash
network:
version: 2
renderer: networkd
ethernets:
eno1:
addresses:
- 10.95.154.18/24
routes:
- to: default
via: 10.95.154.1
nameservers:
addresses: [10.95.128.11, 10.64.152.171, 8.8.8.8, 4.4.4.4]
```
## Sub-tasks
- [ ] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,16 +0,0 @@
---
status: "3-In Progress"
created: "2023-07-25T17:33:20.245Z"
updated: "2023-07-27T18:05:52.709Z"
type: "kanbn"
---
# post-only-once
- Change to keep track but only post on a timmer
## Sub-tasks
- [ ] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,61 +0,0 @@
---
status: "3-In Progress"
created: "2023-07-25T17:31:10.379Z"
updated: "2023-07-27T18:05:52.711Z"
type: "kanbn"
---
# publish
```bash
sudo -i
systemctl stop barcode-host.service
rm -r /var/www/Barcode-Host/Server
mkdir /var/www
mkdir /var/www/Barcode-Host
mkdir /var/www/Barcode-Host/Server
cd /home/unity4/Barcode-Host/Server
dotnet user-secrets list
dotnet nuget list source
dotnet nuget remove source nuget.org
dotnet build --source https://api.nuget.org/v3/index.json
dotnet publish --configuration Release --output /var/www/Barcode-Host/Server --source https://api.nuget.org/v3/index.json
cd /var/www/Barcode-Host/Server
dotnet /var/www/Barcode-Host/Server/Barcode.Host.Server.dll
systemctl start barcode-host.service
```
```bash
nano /etc/fstab
10.95.176.46:EC_Metrology_Si /var/locally-mounted/eaf-dev.mes.infineon.com nfs defaults 0 0
mount /var/locally-mounted/eaf-dev.mes.infineon.com nfs defaults 0 0
mkdir /mnt/share
mkdir /mnt/share/nmshare
mkdir /mnt/share/nmshare/eaf-dev.mes.infineon.com
apt install cifs-utils
mount.cifs //10.95.128.34/EC_Metrology_Si /mnt/share/nmshare/eaf-dev.mes.infineon.com
mount -t cifs -o rw,guest,vers=1.0 //10.95.128.34/EC_Metrology_Si /mnt/share/nmshare/eaf-dev.mes.infineon.com
smbclient --list=10.95.128.34 --no-pass
apt install smbclient
ecmesEAF-10.95.128.34-mestsa07ec(A-Both)
```
```conf
2023-06-03 16:02:25.011 -07:00 [Information] (Barcode.Host.Server.Program.) () () Starting Web Application
2023-06-03 16:02:25.062 -07:00 [Information] (Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager.) () () User profile is available. Using '"/root/.aspnet/DataProtection-Keys"' as key repository; keys will not be encrypted at rest.
2023-06-03 16:02:25.093 -07:00 [Information] (Barcode.Host.Server.HostedService.TimedHostedService.StartAsync) () () Timed Hosted Service: 1234567:3070 running.
2023-06-03 16:02:25.175 -07:00 [Information] (Microsoft.Hosting.Lifetime.) () () Now listening on: "http://localhost:5003"
2023-06-03 16:02:25.175 -07:00 [Information] (Microsoft.Hosting.Lifetime.) () () Application started. Press Ctrl+C to shut down.
2023-06-03 16:02:25.176 -07:00 [Information] (Microsoft.Hosting.Lifetime.) () () Hosting environment: "Production"
2023-06-03 16:02:25.176 -07:00 [Information] (Microsoft.Hosting.Lifetime.) () () Content root path: "/var/www/Barcode-Host/Server"
```
```bash
links http://localhost:5003/api/lastScan
```
## Sub-tasks
- [ ] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,21 +0,0 @@
---
status: "4-Done"
created: "2023-06-06T02:52:34.351Z"
updated: "2023-07-27T18:05:52.742Z"
type: "kanbn"
---
# Pull Repo
```bash
cd /home/unity4
git clone http://76df8eca4a6c11fe29a58c3be37543c11389ab93@192.168.0.73:3000/mikepharesjr/Barcode-Host.git
cd Barcode-Host
code .
```
## Sub-tasks
- [x] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,20 +0,0 @@
---
status: "3-In Progress"
created: "2023-06-08T20:40:12.526Z"
updated: "2023-07-27T18:05:52.712Z"
type: "kanbn"
---
# roll-out
- New page in the OI Viewer
- Set ubuntu frame to new OI Viewer page
- Does it refesh by it self?
- EAF needs what for the batch field
- SP1 needs to get the barcode from one of the two servers dependent on tool queued by EDA
## Sub-tasks
- [ ] phares3757
- [ ] unity4
- [ ] unity5

View File

@ -1,23 +0,0 @@
---
status: "4-Done"
created: "2023-07-25T18:25:05.485Z"
updated: "2023-07-27T18:05:52.743Z"
type: "kanbn"
---
# run-secrets-task
```bash
cd Barcode-Host/Server
dotnet user-secrets init
dotnet user-secrets set "SerialPortName" ""
dotnet user-secrets set "RootPassword" "asdf"
dotnet user-secrets set "PostTo" "http://eaf-staging.mes.infineon.com:8080/api/Barcode/asdf"
dotnet user-secrets list
```
## Sub-tasks
- [x] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,28 +0,0 @@
---
status: "4-Done"
created: "2023-06-06T02:52:34.353Z"
updated: "2023-07-27T18:05:52.744Z"
type: "kanbn"
---
# run-test-ports
```bash
ls -l /dev/ttyUSB*
```
```echo
# crw-rw---- 1 root dialout 188, 0 Jun 3 14:54 /dev/ttyUSB0
```
```bash
sudo -i
adduser unity4 dialout
reboot
```
## Sub-tasks
- [x] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,61 +0,0 @@
---
status: "3-In Progress"
created: "2023-07-25T17:31:10.382Z"
updated: "2023-07-27T18:05:52.713Z"
type: "kanbn"
---
# self-signed-certificate
```bash
sudo -i
echo >/etc/hosts && nano /etc/hosts
```
```conf
127.0.0.1 localhost
127.0.1.1 unity4
10.95.154.18 unity5
#; 10.95.154.54 unity4
192.168.0.40 DESKTOP-H6JG91B
192.168.0.118 ISCN5CG1325C0X
10.95.176.46 eaf-dev.mes.infineon.com
10.95.128.35 eaf-prod.mes.infineon.com
10.95.128.34 eaf-staging.mes.infineon.com
10.95.128.122 oi-prod-ec-api.mes.infineon.com
10.95.176.124 eaf-dev-reporting.mes.infineon.com
10.95.128.37 oi-metrology-viewer-prod.mes.infineon.com
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
```
```bash
sudo -i
apt-get install -y ca-certificates
cd /home/unity4/Barcode-Host
openssl s_client -showcerts -connect DESKTOP-H6JG91B:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >DESKTOP-H6JG91B.crt
cp /home/unity4/Barcode-Host/DESKTOP-H6JG91B.crt /usr/local/share/ca-certificates/DESKTOP-H6JG91B.crt
update-ca-certificates
openssl s_client -showcerts -connect unity4:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >unity4.crt
cp /home/unity4/Barcode-Host/unity4.crt /usr/local/share/ca-certificates/unity4.crt
update-ca-certificates
openssl s_client -showcerts -connect unity5:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >unity5.crt
cp /home/unity5/Barcode-Host/unity5.crt /usr/local/share/ca-certificates/unity5.crt
update-ca-certificates
cd /home/unity4/Barcode-Host
openssl s_client -showcerts -connect eaf-prod.mes.infineon.com:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >eaf-prod.mes.infineon.com.crt
cp /home/unity4/Barcode-Host/eaf-prod.mes.infineon.com.crt /usr/local/share/ca-certificates/eaf-prod.mes.infineon.com.crt
update-ca-certificates
links https://eaf-prod.mes.infineon.com/v3/index.json
exit
```
## Sub-tasks
- [ ] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,131 +0,0 @@
---
status: "4-Done"
created: "2023-06-08T20:40:12.528Z"
updated: "2023-07-27T18:05:52.745Z"
type: "kanbn"
---
# setup-nginx
```bash
echo >/etc/nginx/sites-available/default && nano /etc/nginx/sites-available/default
```
```conf
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
```
```bash
systemctl restart nginx
lsof -i -P -n | grep LISTEN
links http://192.168.0.204/
nginx -t
nginx -s reload
echo >/etc/nginx/sites-available/Barcode-Host-Server && nano /etc/nginx/sites-available/Barcode-Host-Server
```
```conf
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
```
```bash
echo >/home/unity4/localhost.conf && nano /home/unity4/localhost.conf
```
```conf
[req]
default_bits = 2048
default_keyfile = localhost.key
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_ca
[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Arizona
localityName = Locality Name (eg, city)
localityName_default = Mesa
organizationName = Organization Name (eg, company)
organizationName_default = Infineon Technologies Americas Corp.
organizationalUnitName = organizationalunit
organizationalUnitName_default = Development
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = unity4
commonName_max = 64
[req_ext]
subjectAltName = @alt_names
[v3_ca]
subjectAltName = @alt_names
[alt_names]
DNS.1 = unity4
DNS.2 = localhost
DNS.3 = 127.0.0.1
```
```bash
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/localhost.key -out /etc/nginx/localhost.crt -config /home/unity4/localhost.conf
ls /etc/nginx
echo >/etc/nginx/sites-available/Barcode-Host-Server && nano /etc/nginx/sites-available/Barcode-Host-Server
```
```conf
server {
server_name _;
ssl_certificate 'localhost.crt';
listen 443 default_server ssl http2;
ssl_certificate_key 'localhost.key';
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
error_page 500 502 503 504 /50x.html;
listen [::]:443 default_server ssl http2;
location / {
proxy_pass http://localhost:5003;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
```
```bash
ln -s /etc/nginx/sites-available/Barcode-Host-Server /etc/nginx/sites-enabled/Barcode-Host-Server
nginx -t
nginx -s reload
links https://localhost/api/lastscan
links https://unity4/api/lastscan
```
```conf
# C:\Windows\System32\drivers\etc\hosts
192.168.0.204 unity4
```
## Sub-tasks
- [x] phares3757
- [x] unity4
- [x] unity5

View File

@ -1,25 +0,0 @@
---
status: "5-Archive"
created: "2023-06-08T20:40:12.529Z"
updated: "2023-07-27T18:05:52.746Z"
type: "kanbn"
---
# signalr
- [Framework-4.5.1](https://learn.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr?source=recommendations)
- [OnNotificationReceivedAsync](https://learn.microsoft.com/en-us/training/modules/aspnet-core-signalr/3-how-signalr-works)
```bash
# https://learn.microsoft.com/en-us/aspnet/core/tutorials/signalr?view=aspnetcore-7.0&tabs=visual-studio-code
dotnet tool uninstall -g Microsoft.Web.LibraryManager.Cli
dotnet tool install -g Microsoft.Web.LibraryManager.Cli
libman install @microsoft/signalr@latest -p unpkg -d wwwroot/js/signalr --files dist/browser/signalr.js --files dist/browser/signalr.js
# http://localhost:5003/notification
```
## Sub-tasks
- [ ] phares3757
- [ ] unity4
- [ ] unity5

View File

@ -1,22 +0,0 @@
---
status: "3-In Progress"
created: "2023-07-25T17:31:10.383Z"
updated: "2023-07-27T18:05:52.714Z"
type: "kanbn"
---
# update-os
```bash
lsb_release -a
apt update
apt upgrade -y
apt install update-manager-core
do-release-upgrade
```
## Sub-tasks
- [x] phares3757
- [x] unity4
- [ ] unity5

31
.vscode/settings.json vendored
View File

@ -1,19 +1,16 @@
{
"files.eol": "\n",
"[markdown]": {
"editor.wordWrap": "off"
},
"cSpell.enabled": false,
"thunder-client.saveToWorkspace": true,
"thunder-client.workspaceRelativePath": ".vscode",
"coverage-gutters.coverageBaseDir": "../.vscode/TestResults/*",
"[markdown]": {
"editor.wordWrap": "off"
},
"files.exclude": {
"**/node_modules": true
},
"files.watcherExclude": {
"**/node_modules": true
}
"[markdown]": {
"editor.wordWrap": "off"
},
"coverage-gutters.coverageBaseDir": "../.vscode/TestResults/*",
"cSpell.enabled": false,
"files.eol": "\n",
"files.exclude": {
"**/node_modules": true
},
"files.watcherExclude": {
"**/node_modules": true
},
"thunder-client.saveToWorkspace": true,
"thunder-client.workspaceRelativePath": ".vscode"
}

142
.vscode/tasks.json vendored
View File

@ -1,5 +1,4 @@
{
"version": "2.0.0",
"options": {
"env": {
"serverUserSecretsId": "02dce973-df1d-4325-962a-ed549af8d4c5"
@ -7,21 +6,18 @@
},
"tasks": [
{
"label": "userSecretsInit",
"command": "dotnet",
"type": "process",
"args": [
"user-secrets",
"-p",
"${workspaceFolder}/Server/Barcode.Host.Server.csproj",
"init"
],
"problemMatcher": "$msCompile"
"command": "dotnet",
"label": "userSecretsInit",
"problemMatcher": "$msCompile",
"type": "process"
},
{
"label": "userSecretsSet",
"command": "dotnet",
"type": "process",
"args": [
"user-secrets",
"-p",
@ -30,12 +26,12 @@
"asdf",
"123"
],
"problemMatcher": "$msCompile"
"command": "dotnet",
"label": "userSecretsSet",
"problemMatcher": "$msCompile",
"type": "process"
},
{
"label": "userSecretsMkLink",
"command": "cmd",
"type": "shell",
"args": [
"/c",
"mklink",
@ -43,47 +39,47 @@
".vscode\\UserSecrets",
"${userHome}\\AppData\\Roaming\\Microsoft\\UserSecrets\\$env:serverUserSecretsId"
],
"problemMatcher": "$msCompile"
"command": "cmd",
"label": "userSecretsMkLink",
"problemMatcher": "$msCompile",
"type": "shell"
},
{
"label": "buildServer",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/Server/Barcode.Host.Server.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
"command": "dotnet",
"label": "buildServer",
"problemMatcher": "$msCompile",
"type": "process"
},
{
"label": "publishServer",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/Server/Barcode.Host.Server.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
"command": "dotnet",
"label": "publishServer",
"problemMatcher": "$msCompile",
"type": "process"
},
{
"label": "testDebug",
"command": "dotnet",
"type": "process",
"args": [
"test",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
"command": "dotnet",
"label": "testDebug",
"problemMatcher": "$msCompile",
"type": "process"
},
{
"label": "testRelease",
"command": "dotnet",
"type": "process",
"args": [
"test",
"/property:GenerateFullPaths=true",
@ -91,12 +87,12 @@
"-c",
"Release"
],
"problemMatcher": "$msCompile"
"command": "dotnet",
"label": "testRelease",
"problemMatcher": "$msCompile",
"type": "process"
},
{
"label": "format",
"command": "dotnet",
"type": "process",
"args": [
"format",
"--report",
@ -106,24 +102,24 @@
"--severity",
"warn"
],
"problemMatcher": "$msCompile"
"command": "dotnet",
"label": "format",
"problemMatcher": "$msCompile",
"type": "process"
},
{
"label": "old-watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/Server/Barcode.Host.Server.csproj"
],
"problemMatcher": "$msCompile"
"command": "dotnet",
"label": "old-watch",
"problemMatcher": "$msCompile",
"type": "process"
},
{
"label": "watchServer",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"--launch-profile",
@ -133,68 +129,72 @@
"${workspaceFolder}/Server/Barcode.Host.Server.csproj",
"--verbose"
],
"isBackground": true,
"command": "dotnet",
"dependsOn": [
"build"
],
"isBackground": true,
"label": "watchServer",
"problemMatcher": {
"fileLocation": "relative",
"pattern": {
"regexp": "^([^\\s].*)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\):\\s+(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$",
"file": 1,
"location": 2,
"severity": 3,
"code": 4,
"message": 5
},
"background": {
"activeOnStart": true,
"beginsPattern": "^.*Shutdown requested.*",
"endsPattern": "^.*Application started.*"
},
"fileLocation": "relative",
"pattern": {
"code": 4,
"file": 1,
"location": 2,
"message": 5,
"regexp": "^([^\\s].*)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\):\\s+(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$",
"severity": 3
}
}
},
"type": "process"
},
{
"label": "PowerShell Force Clean",
"type": "shell",
"command": "& Get-ChildItem . -include bin,obj -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }",
"problemMatcher": []
"label": "PowerShell Force Clean",
"problemMatcher": [],
"type": "shell"
},
{
"label": "PowerShell Clean TestResults",
"type": "shell",
"command": "& Get-ChildItem . -include TestResults -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }",
"problemMatcher": []
"label": "PowerShell Clean TestResults",
"problemMatcher": [],
"type": "shell"
},
{
"command": "L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net8.0/win-x64/publish/File-Folder-Helper.exe .kanbn",
"label": "File-Folder-Helper AOT s Set metadata",
"type": "shell",
"command": "& L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net7.0/win-x64/publish/File-Folder-Helper.exe .kanbn",
"problemMatcher": []
"problemMatcher": [],
"type": "shell"
},
{
"command": "L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net8.0/win-x64/publish/File-Folder-Helper.exe s M L:/DevOps/Mesa_FI/Barcode-Host -s L:/DevOps/Mesa_FI/Barcode-Host/.kanbn/tasks",
"label": "File-Folder-Helper AOT s M tasks",
"type": "shell",
"command": "& L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net7.0/win-x64/publish/File-Folder-Helper.exe s M .kanbn/tasks",
"problemMatcher": []
"problemMatcher": [],
"type": "shell"
},
{
"label": "Kanbn Console",
"type": "npm",
"problemMatcher": [],
"script": "kanbn.board",
"problemMatcher": []
"type": "npm"
},
{
"label": "Kanbn Write Boad",
"type": "shell",
"command": "& kanbn board -j | L:/Git/kanbn2md/kanbn2md.exe >.kanbn/board.md",
"problemMatcher": []
"label": "Kanbn Write Boad",
"problemMatcher": [],
"type": "shell"
},
{
"label": "Kanbn Write json",
"type": "npm",
"problemMatcher": [],
"script": "kanbn.board.json",
"problemMatcher": []
"type": "npm"
}
]
],
"version": "2.0.0"
}

286
JavaScript/.vscode/4992.json vendored Normal file
View File

@ -0,0 +1,286 @@
{
"prodSpec": {
"keyId": 4992,
"specType": null,
"status": "Inactive",
"minutesPerWafer": 15.74,
"proveInTime": 381.7,
"layerType": "Standard 2 Layer",
"reactorType": "HTR",
"susceptorType": "GMSI",
"tubePressureType": "AP",
"recipeLayers": [
{
"layerNo": 1,
"layerId": "L1",
"layerType": "DEP",
"layerRecipe": null,
"layerDopant": null,
"layerThickMin": 18.05,
"layerThickTarget": 19,
"layerThickMax": 19.95,
"layerThickUnits": "<22>m",
"layerThickAMin": null,
"layerThickATarget": null,
"layerThickAMaxes": null,
"layerThickAUnits": null,
"layerResMin": 1.9,
"layerResTarget": 2,
"layerResMax": 2.1,
"layerResUnits": "<22>-cm",
"layerSResMin": null,
"layerSResTarget": null,
"layerSResMax": null,
"layerSResUnits": null
},
{
"layerNo": 2,
"layerId": "L2",
"layerType": "DEP",
"layerRecipe": null,
"layerDopant": null,
"layerThickMin": 20.9,
"layerThickTarget": 22,
"layerThickMax": 23.1,
"layerThickUnits": "<22>m",
"layerThickAMin": null,
"layerThickATarget": null,
"layerThickAMaxes": null,
"layerThickAUnits": null,
"layerResMin": 5.7,
"layerResTarget": 6,
"layerResMax": 6.3,
"layerResUnits": "<22>-cm",
"layerSResMin": null,
"layerSResTarget": null,
"layerSResMax": null,
"layerSResUnits": null
},
{
"layerNo": 3,
"layerId": 2,
"layerType": "CMB",
"layerRecipe": null,
"layerDopant": null,
"layerThickMin": 38.95,
"layerThickTarget": 41,
"layerThickMax": 43.05,
"layerThickUnits": "<22>m",
"layerThickAMin": null,
"layerThickATarget": null,
"layerThickAMaxes": null,
"layerThickAUnits": null,
"layerResMin": null,
"layerResTarget": null,
"layerResMax": null,
"layerResUnits": null,
"layerSResMin": null,
"layerSResTarget": null,
"layerSResMax": null,
"layerSResUnits": null
}
],
"prodVers": [
{
"keyId": 14574
}
],
"epiPart": {
"keyID": "U021E",
"waferSize": "200 mm 8 in"
},
"custEpiParts": [
{
"keyId": "7113*U021E"
}
],
"prsStages": [
{
"keyId": "4992*UNLOAD",
"psn": 4992,
"stage": "UNLOAD",
"cleans": {
"cleanRecipe": null,
"cleanSigReq": false,
"cleanTools": []
},
"inspection": {
"microscope": false,
"brightlight": false,
"inspSigReq": false,
"inspInterval": null,
"frontSide": {
"lpd": null,
"scratches": null,
"scratchLen": null,
"pits": null,
"mounds": null,
"stackFaults": null,
"spikes": null,
"spots": null,
"blDefects": null
},
"backSide": {
"scratches": null,
"scratchLen": null,
"nodules": null,
"spikes": null
}
},
"surfscan": {
"surfscanSigReq": false,
"surfscanRecipes": []
},
"qaMetTests": [
{
"test": "THICK_ONLY",
"property": "THICK",
"propertyDesc": "Thickness",
"toolClass": "FTIR",
"recipe": "8IN_INF",
"recipePattern": "8IN_INF",
"min": 38.95,
"max": 43.05,
"phaseMin": null,
"slots": "L",
"wfrQty": 1,
"reactSched": false,
"interval": 2,
"start": 1,
"sequence": "1, 3, 5..."
},
{
"test": "CRES",
"property": "CRES",
"propertyDesc": "HgCv Res",
"toolClass": "HGCV",
"recipe": "8IN4_10.SET",
"recipePattern": "8IN4_10.SET",
"min": 5.385,
"max": 5.952,
"phaseMin": 88.5,
"slots": 1,
"wfrQty": 1,
"reactSched": true,
"interval": 8,
"start": 1,
"sequence": "1, 9, 17..."
}
]
},
{
"keyId": "4992*LWI",
"psn": 4992,
"stage": "LWI",
"cleans": {
"cleanRecipe": null,
"cleanSigReq": false,
"cleanTools": []
},
"inspection": {
"microscope": true,
"brightlight": true,
"inspSigReq": true,
"inspInterval": null,
"frontSide": {
"lpd": 20,
"scratches": 1,
"scratchLen": 1,
"pits": 1,
"mounds": 1,
"stackFaults": 10,
"spikes": 5,
"spots": 3,
"blDefects": 1
},
"backSide": {
"scratches": 1,
"scratchLen": 1,
"nodules": null,
"spikes": null
}
},
"surfscan": {
"surfscanSigReq": true,
"surfscanRecipes": [
{
"recipe": "8IN_IFX_ROTR",
"defects": 40,
"haze": 2,
"sampleSize": 6
},
{
"recipe": "IFX100_ROTR",
"defects": 40,
"haze": 2,
"sampleSize": 25
}
]
}
},
{
"keyId": "4992*QA",
"psn": 4992,
"stage": "QA",
"cleans": {
"cleanRecipe": null,
"cleanSigReq": false,
"cleanTools": []
},
"inspection": {
"microscope": false,
"brightlight": false,
"inspSigReq": false,
"inspInterval": null,
"frontSide": {
"lpd": null,
"scratches": null,
"scratchLen": null,
"pits": null,
"mounds": null,
"stackFaults": null,
"spikes": null,
"spots": null,
"blDefects": null
},
"backSide": {
"scratches": null,
"scratchLen": null,
"nodules": null,
"spikes": null
}
},
"surfscan": {
"surfscanSigReq": false,
"surfscanRecipes": []
},
"qaMetTests": [
{
"test": "ADE",
"property": "THICK",
"propertyDesc": "Thickness",
"toolClass": "FTIR",
"recipe": "8IN_INF",
"recipePattern": "Centerpoint",
"min": 38.95,
"max": 43.05,
"phaseMin": null,
"slots": 1,
"wfrQty": 1,
"reactSched": false,
"interval": 1,
"start": 1,
"sequence": "1, 2, 3..."
}
]
}
]
},
"_links": {
"self": {
"href": "https://messa014.infineon.com/api/oiWizard/materials/PROD_SPEC/4992",
"title": "Self"
}
},
"_class": "resource"
}

316
JavaScript/.vscode/5227.json vendored Normal file
View File

@ -0,0 +1,316 @@
{
"prodSpec": {
"keyId": 5227,
"specType": "Production",
"status": "Active",
"minutesPerWafer": 15.99,
"proveInTime": 339.8,
"layerType": "Standard 1 Layer",
"reactorType": "ASM",
"susceptorType": "GMSI",
"tubePressureType": "AP",
"recipeLayers": [
{
"layerNo": 1,
"layerId": "L1",
"layerType": "DEP",
"layerRecipe": 946,
"layerDopant": "Phosphorus",
"layerThickMin": 21.15,
"layerThickTarget": 21.8,
"layerThickMax": 22.45,
"layerThickUnits": "<22>m",
"layerThickAMin": null,
"layerThickATarget": null,
"layerThickAMaxes": null,
"layerThickAUnits": null,
"layerResMin": 5.102,
"layerResTarget": 5.26,
"layerResMax": 5.418,
"layerResUnits": "<22>-cm",
"layerSResMin": null,
"layerSResTarget": null,
"layerSResMax": null,
"layerSResUnits": null
}
],
"prodVers": [
{
"keyId": 15185
},
{
"keyId": 15186
},
{
"keyId": 15187
},
{
"keyId": 15526
}
],
"epiPart": {
"keyID": "U108",
"waferSize": "200 mm 8 in"
},
"custEpiParts": [
{
"keyId": "7127*U108"
}
],
"prsStages": [
{
"keyId": "5227*UNLOAD",
"psn": 5227,
"stage": "UNLOAD",
"cleans": {
"cleanRecipe": null,
"cleanSigReq": false,
"cleanTools": []
},
"inspection": {
"microscope": false,
"brightlight": false,
"inspSigReq": false,
"inspInterval": null,
"frontSide": {
"lpd": null,
"scratches": null,
"scratchLen": null,
"pits": null,
"mounds": null,
"stackFaults": null,
"spikes": null,
"spots": null,
"blDefects": null
},
"backSide": {
"scratches": null,
"scratchLen": null,
"nodules": null,
"spikes": null
}
},
"surfscan": {
"surfscanSigReq": false,
"surfscanRecipes": []
},
"qaMetTests": [
{
"test": "THICK_ONLY",
"property": "THICK",
"propertyDesc": "Thickness",
"toolClass": "FTIR",
"recipe": "PROD_8inch",
"recipePattern": "14PT_3mm",
"min": 21.05,
"max": 22.45,
"phaseMin": null,
"slots": "L",
"wfrQty": 1,
"reactSched": false,
"interval": 2,
"start": 1,
"sequence": "1, 3, 5..."
},
{
"test": "CRES",
"property": "CRES",
"propertyDesc": "HgCv Res",
"toolClass": "HGCV",
"recipe": "8IN4_10.SET",
"recipePattern": "8IN4_10.SET",
"min": 4.74,
"max": 5.47,
"phaseMin": 88.5,
"slots": 1,
"wfrQty": 1,
"reactSched": true,
"interval": 8,
"start": 1,
"sequence": "1, 9, 17..."
}
]
},
{
"keyId": "5227*LWI",
"psn": 5227,
"stage": "LWI",
"cleans": {
"cleanRecipe": null,
"cleanSigReq": false,
"cleanTools": []
},
"inspection": {
"microscope": true,
"brightlight": true,
"inspSigReq": true,
"inspInterval": 2,
"frontSide": {
"lpd": 20,
"scratches": 1,
"scratchLen": 1,
"pits": 1,
"mounds": 1,
"stackFaults": 10,
"spikes": 5,
"spots": 4,
"blDefects": 1
},
"backSide": {
"scratches": 1,
"scratchLen": 1,
"nodules": 10,
"spikes": null
}
},
"surfscan": {
"surfscanSigReq": true,
"surfscanRecipes": [
{
"recipe": "8IN_IFX_ROTR",
"defects": 40,
"haze": 2,
"sampleSize": 3
},
{
"recipe": "IFX100_ROTR",
"defects": 40,
"haze": 2,
"sampleSize": 6
},
{
"recipe": "IFX25_ROTR",
"defects": 40,
"haze": 2,
"sampleSize": 25
}
]
}
},
{
"keyId": "5227*POST",
"psn": 5227,
"stage": "POST",
"cleans": {
"cleanRecipe": "8INCLEAN",
"cleanSigReq": false,
"cleanTools": []
},
"inspection": {
"microscope": false,
"brightlight": false,
"inspSigReq": false,
"inspInterval": null,
"frontSide": {
"lpd": null,
"scratches": null,
"scratchLen": null,
"pits": null,
"mounds": null,
"stackFaults": null,
"spikes": null,
"spots": null,
"blDefects": null
},
"backSide": {
"scratches": null,
"scratchLen": null,
"nodules": null,
"spikes": null
}
},
"surfscan": {
"surfscanSigReq": false,
"surfscanRecipes": [
{
"recipe": "IFXPOSTCLEAN",
"defects": 40,
"haze": 2,
"sampleSize": null
}
]
}
},
{
"keyId": "5227*QA",
"psn": 5227,
"stage": "QA",
"cleans": {
"cleanRecipe": null,
"cleanSigReq": false,
"cleanTools": []
},
"inspection": {
"microscope": false,
"brightlight": false,
"inspSigReq": false,
"inspInterval": null,
"frontSide": {
"lpd": null,
"scratches": null,
"scratchLen": null,
"pits": null,
"mounds": null,
"stackFaults": null,
"spikes": null,
"spots": null,
"blDefects": null
},
"backSide": {
"scratches": null,
"scratchLen": null,
"nodules": null,
"spikes": null
}
},
"surfscan": {
"surfscanSigReq": false,
"surfscanRecipes": []
},
"qaMetTests": [
{
"test": "ADE",
"property": "THICK",
"propertyDesc": "Thickness",
"toolClass": "FTIR",
"recipe": "8inch Centerpoint",
"recipePattern": "Centerpoint",
"min": 21.05,
"max": 22.45,
"phaseMin": null,
"slots": 1,
"wfrQty": 1,
"reactSched": false,
"interval": 1,
"start": 1,
"sequence": "1, 2, 3..."
},
{
"test": "ADE",
"property": "THICK",
"propertyDesc": "Thickness",
"toolClass": "FTIR",
"recipe": "8inch Centerpoint",
"recipePattern": "Centerpoint",
"min": 21.05,
"max": 22.45,
"phaseMin": null,
"slots": "L",
"wfrQty": 1,
"reactSched": false,
"interval": 1,
"start": 1,
"sequence": "1, 2, 3..."
}
]
}
]
},
"_links": {
"self": {
"href": "http://messa014.infineon.com/api/oiWizard/materials/PROD_SPEC/5227",
"title": "Self"
}
},
"_class": "resource"
}

11
JavaScript/.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,11 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Current Opened File",
"program": "${file}"
}
]
}

21
JavaScript/index.js Normal file
View File

@ -0,0 +1,21 @@
var _apiUrl = "http://messa014.infineon.com/api/oiWizard";
fetch(_apiUrl + '/materials/PROD_SPEC/4992', { method: 'GET' })
.then(response => response.json())
.then(data => {
for (const prsStage of data.prodSpec.prsStages) {
if (!prsStage.qaMetTests)
continue;
for (const qaMetTest of prsStage.qaMetTests) {
console.log(qaMetTest.test);
console.log(qaMetTest.slots);
console.log(qaMetTest.recipe);
console.log(qaMetTest.recipePattern);
if (qaMetTest.test !== 'THICK_ONLY')
continue;
console.log(qaMetTest.min);
console.log(qaMetTest.max);
}
}
})
.catch(error => console.log(error));

View File

@ -3,7 +3,8 @@
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<RuntimeIdentifiers>win-x64;linux-x64</RuntimeIdentifiers>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
<UserSecretsId>02dce973-df1d-4325-962a-ed549af8d4c5</UserSecretsId>
</PropertyGroup>
<PropertyGroup>
<VSTestLogger>trx</VSTestLogger>
@ -26,29 +27,17 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="7.0.5" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.1" />
<PackageReference Include="MSTest.TestAdapter" Version="3.0.4" />
<PackageReference Include="MSTest.TestFramework" Version="3.0.4" />
<PackageReference Include="Serilog.Settings.Configuration" Version="7.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Serilog" Version="2.12.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.2.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.2.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\Barcode.Host.Shared.csproj" />
<ProjectReference Include="..\Server\Barcode.Host.Server.csproj" />
</ItemGroup>
<ItemGroup>
<None Include="..\Server\appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="..\Server\appsettings.Development.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@ -2,7 +2,7 @@ using Barcode.Host.Shared.Models;
using Barcode.Host.Shared.Models.Stateless;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Extensions.DependencyInjection;
using Serilog;
using Microsoft.Extensions.Logging;
namespace Barcode.Host.Tests;
@ -10,20 +10,17 @@ namespace Barcode.Host.Tests;
public class UnitTestFileService
{
#pragma warning disable CS8618
private static ILogger _Logger;
private static TestContext _TestContext;
private static WebApplicationFactory<Server.Program> _WebApplicationFactory;
#pragma warning restore
private static ILogger? _Logger;
private static TestContext? _TestContext;
private static WebApplicationFactory<Server.Program>? _WebApplicationFactory;
[ClassInitialize]
public static void ClassInitAsync(TestContext testContext)
{
_TestContext = testContext;
_Logger = Log.ForContext<UnitTestFileService>();
_WebApplicationFactory = new WebApplicationFactory<Server.Program>();
IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider;
_Logger = serviceProvider.GetRequiredService<ILogger<Server.Program>>();
}
private static void NonThrowTryCatch()
@ -39,13 +36,15 @@ public class UnitTestFileService
[TestMethod]
public void GetWrite()
{
_Logger.Information("Starting Web Application");
IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider;
Server.Models.AppSettings appSettings = serviceProvider.GetRequiredService<Server.Models.AppSettings>();
IFileService fileService = serviceProvider.GetRequiredService<IFileService>();
Notification notification = new(KeyPressEvent: null, "Test", appSettings.ToolClass, null);
_Logger?.LogInformation("Starting Web Application");
IServiceProvider? serviceProvider = _WebApplicationFactory?.Services.CreateScope().ServiceProvider;
Server.Models.AppSettings? appSettings = serviceProvider?.GetRequiredService<Server.Models.AppSettings>();
IFileService? fileService = serviceProvider?.GetRequiredService<IFileService>();
Assert.IsNotNull(appSettings);
Assert.IsNotNull(fileService);
Notification? notification = new(KeyPressEvent: null, "Test", appSettings.ToolClass, null);
fileService.Write(appSettings.EquipmentName, appSettings.FileShare, calendar: null, notification);
_Logger.Information($"{_TestContext?.TestName} completed");
_Logger?.LogInformation("{testName} completed", _TestContext?.TestName);
NonThrowTryCatch();
}

View File

@ -2,7 +2,7 @@ using Barcode.Host.Shared.DataModels;
using Barcode.Host.Shared.Models.Stateless;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Extensions.DependencyInjection;
using Serilog;
using Microsoft.Extensions.Logging;
namespace Barcode.Host.Tests;
@ -10,21 +10,18 @@ namespace Barcode.Host.Tests;
public class UnitTestLastScanController
{
#pragma warning disable CS8618
private static ILogger _Logger;
private static string _ControllerName;
private static TestContext _TestContext;
private static WebApplicationFactory<Server.Program> _WebApplicationFactory;
#pragma warning restore
private static ILogger? _Logger;
private static string? _ControllerName;
private static TestContext? _TestContext;
private static WebApplicationFactory<Server.Program>? _WebApplicationFactory;
[ClassInitialize]
public static void ClassInitAsync(TestContext testContext)
{
_TestContext = testContext;
_Logger = Log.ForContext<UnitTestLastScanController>();
_WebApplicationFactory = new WebApplicationFactory<Server.Program>();
IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider;
_Logger = serviceProvider.GetRequiredService<ILogger<Server.Program>>();
_ControllerName = nameof(Server.ApiControllers.LastScanController)[..^10];
}
@ -38,9 +35,9 @@ public class UnitTestLastScanController
[TestMethod]
public void TestControllerName()
{
_Logger.Information("Starting Web Application");
_Logger?.LogInformation("Starting Web Application");
Assert.AreEqual(ILastScanController<string>.GetRouteName(), _ControllerName);
_Logger.Information($"{_TestContext?.TestName} completed");
_Logger?.LogInformation("{testName} completed", _TestContext?.TestName);
NonThrowTryCatch();
}
@ -50,12 +47,13 @@ public class UnitTestLastScanController
[TestMethod]
public void GetScan()
{
_Logger.Information("Starting Web Application");
IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider;
ILastScanService lastScanService = serviceProvider.GetRequiredService<ILastScanService>();
_Logger?.LogInformation("Starting Web Application");
IServiceProvider? serviceProvider = _WebApplicationFactory?.Services.CreateScope().ServiceProvider;
ILastScanService? lastScanService = serviceProvider?.GetRequiredService<ILastScanService>();
Assert.IsNotNull(lastScanService);
Result<string> result = lastScanService.GetScan();
Assert.IsNotNull(result?.Results);
_Logger.Information($"{_TestContext?.TestName} completed");
_Logger?.LogInformation("{testName} completed", _TestContext?.TestName);
NonThrowTryCatch();
}
@ -65,13 +63,14 @@ public class UnitTestLastScanController
[TestMethod]
public async Task GetScanApi()
{
HttpClient httpClient = _WebApplicationFactory.CreateClient();
_Logger.Information("Starting Web Application");
HttpClient? httpClient = _WebApplicationFactory?.CreateClient();
_Logger?.LogInformation("Starting Web Application");
Assert.IsNotNull(httpClient);
string? json = await httpClient.GetStringAsync($"api/{_ControllerName}/O171927.1.37/");
File.WriteAllText(Path.Combine(AppContext.BaseDirectory, $"{_ControllerName}-{nameof(GetScan)}.json"), json);
Result<string>? result = System.Text.Json.JsonSerializer.Deserialize<Result<string>>(json);
Assert.IsNotNull(result?.Results);
_Logger.Information($"{_TestContext?.TestName} completed");
_Logger?.LogInformation("{testName} completed", _TestContext?.TestName);
NonThrowTryCatch();
}

View File

@ -2,7 +2,7 @@ using Barcode.Host.Shared.Models;
using Barcode.Host.Shared.Models.Stateless;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Extensions.DependencyInjection;
using Serilog;
using Microsoft.Extensions.Logging;
namespace Barcode.Host.Tests;
@ -10,20 +10,17 @@ namespace Barcode.Host.Tests;
public class UnitTestPostService
{
#pragma warning disable CS8618
private static ILogger _Logger;
private static TestContext _TestContext;
private static WebApplicationFactory<Server.Program> _WebApplicationFactory;
#pragma warning restore
private static ILogger? _Logger;
private static TestContext? _TestContext;
private static WebApplicationFactory<Server.Program>? _WebApplicationFactory;
[ClassInitialize]
public static void ClassInitAsync(TestContext testContext)
{
_TestContext = testContext;
_Logger = Log.ForContext<UnitTestPostService>();
_WebApplicationFactory = new WebApplicationFactory<Server.Program>();
IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider;
_Logger = serviceProvider.GetRequiredService<ILogger<Server.Program>>();
}
private static void NonThrowTryCatch()
@ -39,14 +36,18 @@ public class UnitTestPostService
[TestMethod]
public void GetPostTo()
{
_Logger.Information("Starting Web Application");
HttpClient httpClient = _WebApplicationFactory.CreateClient();
IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider;
Server.Models.AppSettings appSettings = serviceProvider.GetRequiredService<Server.Models.AppSettings>();
IPostService postService = serviceProvider.GetRequiredService<IPostService>();
Notification notification = new(KeyPressEvent: null, "Test", appSettings.ToolClass, null);
_Logger?.LogInformation("Starting Web Application");
HttpClient? httpClient = _WebApplicationFactory?.CreateClient();
IServiceProvider? serviceProvider = _WebApplicationFactory?.Services.CreateScope().ServiceProvider;
Server.Models.AppSettings? appSettings = serviceProvider?.GetRequiredService<Server.Models.AppSettings>();
IPostService? postService = serviceProvider?.GetRequiredService<IPostService>();
Assert.IsNotNull(httpClient);
Assert.IsNotNull(appSettings);
Assert.IsNotNull(postService);
Notification? notification = new(KeyPressEvent: null, "Test", appSettings.ToolClass, null);
Assert.IsNotNull(notification);
_ = postService.Post(appSettings.PostTo, httpClient, notification);
_Logger.Information($"{_TestContext?.TestName} completed");
_Logger?.LogInformation("{testName} completed", _TestContext?.TestName);
NonThrowTryCatch();
}

View File

@ -4,7 +4,7 @@
<Nullable>enable</Nullable>
<OutputType>Exe</OutputType>
<RuntimeIdentifiers>win-x64;linux-x64</RuntimeIdentifiers>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
<UserSecretsId>02dce973-df1d-4325-962a-ed549af8d4c5</UserSecretsId>
</PropertyGroup>
<PropertyGroup>
@ -22,27 +22,17 @@
<DefineConstants>Linux</DefineConstants>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CliWrap" Version="3.6.3" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="7.0.5" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="7.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="7.0.0" />
<PackageReference Include="Serilog" Version="2.12.0" />
<PackageReference Include="CliWrap" Version="3.6.6" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageReference Include="System.IO.Ports" Version="7.0.0" />
<PackageReference Include="System.Text.Json" Version="7.0.2" />
<PackageReference Include="System.IO.Ports" Version="8.0.0" />
<PackageReference Include="System.Text.Json" Version="8.0.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\Barcode.Host.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<None Include="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="appsettings.Development.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@ -5,7 +5,6 @@ using Barcode.Host.Shared.KeyboardMouse;
using Barcode.Host.Shared.Models;
using Barcode.Host.Shared.Models.Stateless;
using Microsoft.AspNetCore.SignalR;
using Serilog.Context;
using System.Globalization;
namespace Barcode.Host.Server.HostedService;
@ -65,12 +64,9 @@ public class TimedHostedService : IHostedService, IAggregateInputReader, IDispos
public Task StartAsync(CancellationToken stoppingToken)
{
string? methodName = IMethodName.GetActualAsyncMethodName();
using (LogContext.PushProperty("MethodName", methodName))
{
_Logger.LogInformation($"Timed Hosted Service: {_AppSettings.BuildSourceVersion}:{Environment.ProcessId} running.");
if (!string.IsNullOrEmpty(_AppSettings.SerialPortName))
_SerialService.Open();
_Logger.LogInformation("Timed Hosted Service: {BuildSourceVersion}:{ProcessId} running.", _AppSettings.BuildSourceVersion, Environment.ProcessId);
if (!string.IsNullOrEmpty(_AppSettings.SerialPortName))
_SerialService.Open();
#if Linux
if (!_LinuxGroupManager.IsInInputGroup().WaitAsync(stoppingToken).Result)
{
@ -80,32 +76,29 @@ public class TimedHostedService : IHostedService, IAggregateInputReader, IDispos
_ = _LinuxGroupManager.RebootSystem(_AppSettings.RootPassword);
}
#endif
List<(EventCode, char)> collection = _LastScanService.IncludeEventCodes();
foreach ((EventCode eventCode, char @char) in collection)
_CharToEventCodes.Add(eventCode, @char);
int dueTime = 0;
foreach ((string _, Timer timer) in _Timers)
{
dueTime += 300;
_ = timer.Change(dueTime, Timeout.Infinite);
}
List<(EventCode, char)> collection = _LastScanService.IncludeEventCodes();
foreach ((EventCode eventCode, char @char) in collection)
_CharToEventCodes.Add(eventCode, @char);
int dueTime = 0;
foreach ((string _, Timer timer) in _Timers)
{
dueTime += 300;
_ = timer.Change(dueTime, Timeout.Infinite);
}
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken stoppingToken)
{
string? methodName = IMethodName.GetActualAsyncMethodName();
using (LogContext.PushProperty("MethodName", methodName))
_Logger.LogInformation("Timed Hosted Service: {BuildSourceVersion}:{ProcessId} is stopping.", _AppSettings.BuildSourceVersion, Environment.ProcessId);
for (short i = 0; i < short.MaxValue; i++)
{
_Logger.LogInformation($"Timed Hosted Service: {_AppSettings.BuildSourceVersion}:{Environment.ProcessId} is stopping.");
for (short i = 0; i < short.MaxValue; i++)
{
Thread.Sleep(500);
if (_ExecutionCount == 0)
break;
}
Thread.Sleep(500);
if (_ExecutionCount == 0)
break;
}
return Task.CompletedTask;
}

View File

@ -1,4 +1,5 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Barcode.Host.Server.Models;
@ -32,8 +33,14 @@ public record AppSettings(string BuildNumber,
public override string ToString()
{
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
string result = JsonSerializer.Serialize(this, AppSettingsSourceGenerationContext.Default.AppSettings);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(AppSettings))]
internal partial class AppSettingsSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -0,0 +1,2 @@
[*.cs]
csharp_preserve_single_line_statements = true

View File

@ -1,4 +1,3 @@
using System.ComponentModel.DataAnnotations;
using System.Text.Json;
namespace Barcode.Host.Server.Models.Binder;
@ -6,34 +5,32 @@ namespace Barcode.Host.Server.Models.Binder;
public class AppSettings
{
[Display(Name = "Build Number"), Required] public string? BuildNumber { get; set; }
[Display(Name = "Build Source Version"), Required] public string? BuildSourceVersion { get; set; }
[Display(Name = "Last Scan Service Clear After"), Required] public int? ClearLastScanServiceAfter { get; set; }
[Display(Name = "Company"), Required] public string? Company { get; set; }
[Display(Name = "Device Name Ends With"), Required] public string? DeviceNameEndsWith { get; set; }
[Display(Name = "Equipment Name"), Required] public string? EquipmentName { get; set; }
[Display(Name = "ExpectedScanLengthA"), Required] public int? ExpectedScanLengthA { get; set; }
[Display(Name = "ExpectedScanLengthB"), Required] public int? ExpectedScanLengthB { get; set; }
[Display(Name = "File Share"), Required] public string? FileShare { get; set; }
[Display(Name = "Is Development"), Required] public bool? IsDevelopment { get; set; }
[Display(Name = "Is Staging"), Required] public bool? IsStaging { get; set; }
[Display(Name = "Linux Device Path"), Required] public string? LinuxDevicePath { get; set; }
[Display(Name = "Mock Root"), Required] public string? MockRoot { get; set; }
[Display(Name = "MonA Resource"), Required] public string? MonAResource { get; set; }
[Display(Name = "MonA Site"), Required] public string? MonASite { get; set; }
[Display(Name = "Notify Minimum"), Required] public int? NotifyMinimum { get; set; }
[Display(Name = "OpenInsight Application Programming Interface"), Required] public string? OpenInsightApplicationProgrammingInterface { get; set; }
[Display(Name = "PostTo"), Required] public string? PostTo { get; set; }
[Display(Name = "Post to Every"), Required] public int? PostToEvery { get; set; }
[Display(Name = "RootPassword"), Required] public string? RootPassword { get; set; }
[Display(Name = "Serial Port Name"), Required] public string? SerialPortName { get; set; }
[Display(Name = "Share to Every"), Required] public int? ShareToEvery { get; set; }
[Display(Name = "ToolClass"), Required] public string? ToolClass { get; set; }
[Display(Name = "URLs"), Required] public string? URLs { get; set; }
[Display(Name = "Working Directory Name"), Required] public string? WorkingDirectoryName { get; set; }
[Display(Name = "WriteToSerialEvery"), Required] public int? WriteToSerialEvery { get; set; }
#nullable restore
public string? BuildNumber { get; set; }
public string? BuildSourceVersion { get; set; }
public int? ClearLastScanServiceAfter { get; set; }
public string? Company { get; set; }
public string? DeviceNameEndsWith { get; set; }
public string? EquipmentName { get; set; }
public int? ExpectedScanLengthA { get; set; }
public int? ExpectedScanLengthB { get; set; }
public string? FileShare { get; set; }
public bool? IsDevelopment { get; set; }
public bool? IsStaging { get; set; }
public string? LinuxDevicePath { get; set; }
public string? MockRoot { get; set; }
public string? MonAResource { get; set; }
public string? MonASite { get; set; }
public int? NotifyMinimum { get; set; }
public string? OpenInsightApplicationProgrammingInterface { get; set; }
public string? PostTo { get; set; }
public int? PostToEvery { get; set; }
public string? RootPassword { get; set; }
public string? SerialPortName { get; set; }
public int? ShareToEvery { get; set; }
public string? ToolClass { get; set; }
public string? URLs { get; set; }
public string? WorkingDirectoryName { get; set; }
public int? WriteToSerialEvery { get; set; }
public override string ToString()
{
@ -41,63 +38,53 @@ public class AppSettings
return result;
}
private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings)
{
if (appSettings?.Company is null)
{
List<string> paths = new();
foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers)
{
if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider)
continue;
if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider)
continue;
paths.Add(physicalFileProvider.Root);
}
throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}");
}
}
private static Models.AppSettings Get(AppSettings? appSettings)
{
Models.AppSettings result;
if (appSettings is null)
throw new NullReferenceException(nameof(appSettings));
if (appSettings.BuildNumber is null)
throw new NullReferenceException(nameof(BuildNumber));
if (appSettings.BuildSourceVersion is null)
throw new NullReferenceException(nameof(BuildSourceVersion));
if (appSettings.ClearLastScanServiceAfter is null)
throw new NullReferenceException(nameof(ClearLastScanServiceAfter));
if (appSettings.Company is null)
throw new NullReferenceException(nameof(Company));
if (appSettings.DeviceNameEndsWith is null)
throw new NullReferenceException(nameof(DeviceNameEndsWith));
if (appSettings.EquipmentName is null)
throw new NullReferenceException(nameof(EquipmentName));
if (appSettings.ExpectedScanLengthA is null)
throw new NullReferenceException(nameof(ExpectedScanLengthA));
if (appSettings.ExpectedScanLengthB is null)
throw new NullReferenceException(nameof(ExpectedScanLengthB));
if (appSettings.FileShare is null)
throw new NullReferenceException(nameof(FileShare));
if (appSettings.IsDevelopment is null)
throw new NullReferenceException(nameof(IsDevelopment));
if (appSettings.IsStaging is null)
throw new NullReferenceException(nameof(IsStaging));
if (appSettings.LinuxDevicePath is null)
throw new NullReferenceException(nameof(LinuxDevicePath));
if (appSettings.MockRoot is null)
throw new NullReferenceException(nameof(MockRoot));
if (appSettings.MonAResource is null)
throw new NullReferenceException(nameof(MonAResource));
if (appSettings.MonASite is null)
throw new NullReferenceException(nameof(MonASite));
if (appSettings.NotifyMinimum is null)
throw new NullReferenceException(nameof(NotifyMinimum));
if (appSettings.OpenInsightApplicationProgrammingInterface is null)
throw new NullReferenceException(nameof(OpenInsightApplicationProgrammingInterface));
if (appSettings.PostTo is null)
throw new NullReferenceException(nameof(PostTo));
if (appSettings.PostToEvery is null)
throw new NullReferenceException(nameof(PostToEvery));
if (appSettings.RootPassword is null)
throw new NullReferenceException(nameof(RootPassword));
if (appSettings.SerialPortName is null)
throw new NullReferenceException(nameof(SerialPortName));
if (appSettings.ShareToEvery is null)
throw new NullReferenceException(nameof(ShareToEvery));
if (appSettings.ToolClass is null)
throw new NullReferenceException(nameof(ToolClass));
if (appSettings.URLs is null)
throw new NullReferenceException(nameof(URLs));
if (appSettings.WorkingDirectoryName is null)
throw new NullReferenceException(nameof(WorkingDirectoryName));
if (appSettings.WriteToSerialEvery is null)
throw new NullReferenceException(nameof(WriteToSerialEvery));
if (appSettings is null) throw new NullReferenceException(nameof(appSettings));
if (appSettings.BuildNumber is null) throw new NullReferenceException(nameof(BuildNumber));
if (appSettings.BuildSourceVersion is null) throw new NullReferenceException(nameof(BuildSourceVersion));
if (appSettings.ClearLastScanServiceAfter is null) throw new NullReferenceException(nameof(ClearLastScanServiceAfter));
if (appSettings.Company is null) throw new NullReferenceException(nameof(Company));
if (appSettings.DeviceNameEndsWith is null) throw new NullReferenceException(nameof(DeviceNameEndsWith));
if (appSettings.EquipmentName is null) throw new NullReferenceException(nameof(EquipmentName));
if (appSettings.ExpectedScanLengthA is null) throw new NullReferenceException(nameof(ExpectedScanLengthA));
if (appSettings.ExpectedScanLengthB is null) throw new NullReferenceException(nameof(ExpectedScanLengthB));
if (appSettings.FileShare is null) throw new NullReferenceException(nameof(FileShare));
if (appSettings.IsDevelopment is null) throw new NullReferenceException(nameof(IsDevelopment));
if (appSettings.IsStaging is null) throw new NullReferenceException(nameof(IsStaging));
if (appSettings.LinuxDevicePath is null) throw new NullReferenceException(nameof(LinuxDevicePath));
if (appSettings.MockRoot is null) throw new NullReferenceException(nameof(MockRoot));
if (appSettings.MonAResource is null) throw new NullReferenceException(nameof(MonAResource));
if (appSettings.MonASite is null) throw new NullReferenceException(nameof(MonASite));
if (appSettings.NotifyMinimum is null) throw new NullReferenceException(nameof(NotifyMinimum));
if (appSettings.OpenInsightApplicationProgrammingInterface is null) throw new NullReferenceException(nameof(OpenInsightApplicationProgrammingInterface));
if (appSettings.PostTo is null) throw new NullReferenceException(nameof(PostTo));
if (appSettings.PostToEvery is null) throw new NullReferenceException(nameof(PostToEvery));
if (appSettings.RootPassword is null) throw new NullReferenceException(nameof(RootPassword));
if (appSettings.SerialPortName is null) throw new NullReferenceException(nameof(SerialPortName));
if (appSettings.ShareToEvery is null) throw new NullReferenceException(nameof(ShareToEvery));
if (appSettings.ToolClass is null) throw new NullReferenceException(nameof(ToolClass));
if (appSettings.URLs is null) throw new NullReferenceException(nameof(URLs));
if (appSettings.WorkingDirectoryName is null) throw new NullReferenceException(nameof(WorkingDirectoryName));
if (appSettings.WriteToSerialEvery is null) throw new NullReferenceException(nameof(WriteToSerialEvery));
result = new(
appSettings.BuildNumber,
appSettings.BuildSourceVersion,
@ -131,7 +118,10 @@ public class AppSettings
public static Models.AppSettings Get(IConfigurationRoot configurationRoot)
{
Models.AppSettings result;
#pragma warning disable IL3050, IL2026
AppSettings? appSettings = configurationRoot.Get<AppSettings>();
#pragma warning restore IL3050, IL2026
PreVerify(configurationRoot, appSettings);
result = Get(appSettings);
return result;
}

View File

@ -1,6 +1,6 @@
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Diagnostics;
namespace Barcode.Host.Server.Pages;
@ -20,4 +20,3 @@ public class ErrorModel : PageModel
public void OnGet() =>
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
}

View File

@ -2,50 +2,21 @@
using Barcode.Host.Server.Hubs;
using Barcode.Host.Server.Models;
using Barcode.Host.Server.Services;
using Barcode.Host.Shared.Models;
using Barcode.Host.Shared.Models.Stateless;
using Serilog;
using System.Reflection;
namespace Barcode.Host.Server;
public class Program
{
private static (string, WebApplicationOptions) Get(string[] args)
{
Assembly assembly = Assembly.GetExecutingAssembly();
string? assemblyName = assembly.GetName()?.Name;
if (string.IsNullOrEmpty(assemblyName))
throw new Exception();
string baseAssemblyName = assemblyName.Split('.')[0];
string webRootPath = Path.Combine(AppContext.BaseDirectory.Split(baseAssemblyName)[0], baseAssemblyName, "wwwroot");
if (!Directory.Exists(webRootPath))
webRootPath = string.Empty;
WebApplicationOptions webApplicationOptions = new()
{
Args = args,
ContentRootPath = AppContext.BaseDirectory,
WebRootPath = webRootPath
};
return new(assemblyName, webApplicationOptions);
}
public static int Main(string[] args)
{
LoggerConfiguration loggerConfiguration = new();
(string assemblyName, _) = Get(args);
ILogger<Program>? logger = null;
WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(args);
_ = webApplicationBuilder.Configuration.AddUserSecrets<Program>();
AppSettings appSettings = Models.Binder.AppSettings.Get(webApplicationBuilder.Configuration);
if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName))
throw new Exception("Working directory name must have a value!");
string workingDirectory = IWorkingDirectory.GetWorkingDirectory(assemblyName, appSettings.WorkingDirectoryName);
Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory);
_ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, webApplicationBuilder.Configuration);
_ = SerilogHostBuilderExtensions.UseSerilog(webApplicationBuilder.Host);
Log.Logger = loggerConfiguration.CreateLogger();
Serilog.ILogger log = Log.ForContext<Program>();
if (string.IsNullOrEmpty(appSettings.Company))
throw new Exception("Company name must have a value!");
try
{
if (appSettings.IsStaging && appSettings.IsDevelopment)
@ -68,6 +39,7 @@ public class Program
_ = webApplicationBuilder.Services.AddHostedService<TimedHostedService>();
_ = webApplicationBuilder.Services.AddSwaggerGen();
WebApplication webApplication = webApplicationBuilder.Build();
logger = webApplication.Services.GetRequiredService<ILogger<Program>>();
if (appSettings.IsDevelopment)
{
_ = webApplication.UseSwagger();
@ -79,25 +51,23 @@ public class Program
_ = webApplication.UseExceptionHandler("/Error");
_ = webApplication.UseHsts();
}
_ = webApplication.Lifetime.ApplicationStopped.Register(Log.CloseAndFlush);
_ = webApplication.UseStaticFiles();
_ = webApplication.UseRouting();
_ = webApplication.UseAuthorization();
_ = webApplication.MapControllers();
_ = webApplication.MapRazorPages();
_ = webApplication.MapHub<NotificationHub>($"/{nameof(NotificationHub)}");
log.Information("Starting Web Application");
logger.LogInformation("Starting Web Application");
logger.LogCritical("{Company}", appSettings.Company);
webApplication.Run();
return 0;
}
catch (Exception ex)
{
log.Fatal(ex, "Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
try
{ logger?.LogCritical(ex, "Host terminated unexpectedly"); }
catch (Exception) { }
throw;
}
}

View File

@ -1,13 +0,0 @@
{
"ExpectedScanLengthA": 6,
"ExpectedScanLengthB": 9,
"Logging": {
"LogLevel": {
"Log4netProvider": "Debug"
}
},
"IsDevelopment": true,
"Serilog": {
"MinimumLevel": "Debug"
}
}

View File

@ -1,74 +0,0 @@
{
"BuildNumber": "1",
"BuildSourceVersion": "1234567",
"Company": "Infineon Technologies Americas Corp.",
"ClearLastScanServiceAfter": 250,
"DeviceNameEndsWith": "Symbol Bar Code Scanner",
"EquipmentName": "",
"ExpectedScanLengthA": 8,
"ExpectedScanLengthB": 14,
"ExpectedScanLengthBExample": "1TO172125.1.11",
"FileShare": "",
"LinuxDevicePath": "/proc/bus/input/devices",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Log4netProvider": "Information",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"IsDevelopment": false,
"IsStaging": false,
"NotifyMinimum": 3,
"MockRoot": "",
"MonAResource": "OI_Metrology_Viewer_EC",
"MonASite": "auc",
"OpenInsightApplicationProgrammingInterface": "https://oi-prod-ec-api.mes.infineon.com/api/oiWizard",
"PostTo": "",
"PostToEvery": 1000,
"SerialPortName": "/dev/ttyUSB0",
"Serilog": {
"Using": [
"Serilog.Sinks.Console",
"Serilog.Sinks.File"
],
"MinimumLevel": "Information",
"WriteTo": [
{
"Name": "Debug",
"Args": {
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}"
}
},
{
"Name": "Console",
"Args": {
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}"
}
},
{
"Name": "File",
"Args": {
"path": "%workingDirectory% - Log/log-.txt",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}",
"rollingInterval": "Hour"
}
}
],
"Enrich": [
"FromLogContext",
"WithMachineName",
"WithThreadId"
],
"Properties": {
"Application": "Sample"
}
},
"ShareToEvery": 1000,
"RootPassword": "",
"ToolClass": "FTIR",
"URLs": "http://localhost:5003;",
"WorkingDirectoryName": "IFXApps",
"WriteToSerialEvery": 750
}

View File

@ -3,7 +3,7 @@
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<RuntimeIdentifiers>win-x64;linux-x64</RuntimeIdentifiers>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<IsWindows Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Windows)))' == 'true'">true</IsWindows>
@ -20,10 +20,10 @@
<DefineConstants>Linux</DefineConstants>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Text.Json" Version="7.0.2" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0" />
<PackageReference Include="System.Text.Json" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="8.0.0" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,58 @@
trigger:
branches:
include:
- red-hat
paths:
include:
- "Server/*"
- "Shared/*"
- "Server.Tests/*"
exclude:
- ".vscode/*"
- "JavaScript/*"
- "SignalRChat/*"
- "**/*.yml"
variables:
BuildConfiguration: "Release"
ASPNETCORE_ENVIRONMENT: "Production"
stages:
- stage: auclv0558
displayName: auclv0558
pool:
name: open-insight-metrology-viewer
demands: barcode-host-auclv0558
jobs:
- job: auclv0558
steps:
- script: |
echo $(Build.BuildId)
echo $(Build.Reason)
echo $(Build.Repository.Id)
echo $(Build.Repository.Name)
echo $(Build.SourceVersion)
displayName: "Echo Check"
- script: "dotnet nuget locals all --clear"
displayName: "Nuget Clear"
enabled: false
- script: |
dotnet user-secrets init
dotnet user-secrets set "BuildNumber" "$(Build.BuildId)"
dotnet user-secrets set "BuildSourceVersion" "$(Build.SourceVersion)"
dotnet user-secrets list
workingDirectory: Server
displayName: "Safe storage of app secrets - Server"
- script: "dotnet build --configuration $(BuildConfiguration) --source https://eaf-prod.mes.infineon.com/v3/index.json"
workingDirectory: Server
displayName: "Core Build - Server"
- script: "dotnet publish --configuration $(BuildConfiguration) --output ~/Barcode-Host-$(Build.SourceVersion)-$(Build.BuildId)-$(BuildConfiguration)/Server"
workingDirectory: Server
displayName: "Core Publish - Server"
- script: "echo ln -s /home/$USER/Barcode-Host-$(Build.SourceVersion)-$(Build.BuildId)-$(BuildConfiguration)/Server /var/www/Barcode-Host/Server"
displayName: "Echo Symbolic Link Command"