cyberia 2.89.2 → 2.89.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/.env.development +2 -0
  2. package/.env.production +2 -0
  3. package/.env.test +2 -0
  4. package/.github/workflows/engine-cyberia.cd.yml +4 -0
  5. package/.github/workflows/release.cd.yml +2 -0
  6. package/bin/cyberia.js +10 -7
  7. package/bin/deploy.js +22 -15
  8. package/bin/index.js +10 -7
  9. package/cli.md +105 -54
  10. package/deployment.yaml +34 -6
  11. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  12. package/manifests/deployment/dd-test-development/deployment.yaml +18 -6
  13. package/manifests/deployment/dd-test-development/proxy.yaml +2 -0
  14. package/manifests/deployment/kafka/deployment.yaml +0 -2
  15. package/manifests/deployment/spark/spark-pi-py.yaml +0 -1
  16. package/manifests/deployment/tensorflow/tf-gpu-test.yaml +0 -2
  17. package/manifests/envoy-service-nodeport.yaml +0 -1
  18. package/manifests/kubeadm-calico-config.yaml +10 -115
  19. package/manifests/letsencrypt-prod.yaml +0 -1
  20. package/manifests/mariadb/statefulset.yaml +1 -1
  21. package/manifests/mongodb/statefulset.yaml +11 -11
  22. package/manifests/mongodb-4.4/service-deployment.yaml +1 -3
  23. package/manifests/mysql/pv-pvc.yaml +1 -1
  24. package/manifests/mysql/statefulset.yaml +1 -1
  25. package/manifests/pv-pvc-dd.yaml +34 -0
  26. package/manifests/valkey/service.yaml +0 -1
  27. package/manifests/valkey/statefulset.yaml +2 -3
  28. package/package.json +1 -1
  29. package/proxy.yaml +6 -0
  30. package/scripts/device-scan.sh +43 -21
  31. package/scripts/gen-fqdns.sh +14 -0
  32. package/scripts/ip-info.sh +118 -0
  33. package/scripts/rpmfusion-ffmpeg-setup.sh +1 -0
  34. package/src/api/object-layer/object-layer.controller.js +19 -0
  35. package/src/api/object-layer/object-layer.router.js +4 -0
  36. package/src/api/object-layer/object-layer.service.js +111 -0
  37. package/src/api/user/user.model.js +10 -1
  38. package/src/cli/cluster.js +88 -75
  39. package/src/cli/deploy.js +165 -85
  40. package/src/cli/index.js +44 -3
  41. package/src/cli/monitor.js +12 -6
  42. package/src/cli/repository.js +13 -1
  43. package/src/cli/run.js +127 -60
  44. package/src/client/components/core/Logger.js +1 -1
  45. package/src/client/components/core/Modal.js +5 -0
  46. package/src/client/components/core/ObjectLayerEngineModal.js +336 -72
  47. package/src/client/components/core/ObjectLayerEngineViewer.js +239 -420
  48. package/src/client/components/core/Router.js +10 -1
  49. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +1 -1
  50. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +1 -1
  51. package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +1 -1
  52. package/src/client/components/cyberia-portal/ObjectLayerCyberiaPortal.js +44 -4
  53. package/src/client/services/default/default.management.js +25 -5
  54. package/src/client/services/object-layer/object-layer.management.js +8 -8
  55. package/src/client/services/object-layer/object-layer.service.js +34 -0
  56. package/src/index.js +1 -1
  57. package/src/server/client-build.js +5 -4
  58. package/src/server/conf.js +1 -1
  59. package/src/server/start.js +3 -1
  60. package/manifests/kubelet-config.yaml +0 -65
  61. package/manifests/mongodb/backup-access.yaml +0 -16
  62. package/manifests/mongodb/backup-cronjob.yaml +0 -42
  63. package/manifests/mongodb/backup-pv-pvc.yaml +0 -22
  64. package/manifests/mongodb/configmap.yaml +0 -26
@@ -3,6 +3,7 @@ apiVersion: apps/v1
3
3
  kind: Deployment
4
4
  metadata:
5
5
  name: dd-test-development-blue
6
+ namespace: default
6
7
  labels:
7
8
  app: dd-test-development-blue
8
9
  spec:
@@ -17,7 +18,7 @@ spec:
17
18
  spec:
18
19
  containers:
19
20
  - name: dd-test-development-blue
20
- image: localhost/rockylinux9-underpost:v2.89.2
21
+ image: localhost/rockylinux9-underpost:v2.89.45
21
22
  # resources:
22
23
  # requests:
23
24
  # memory: "96294Ki"
@@ -33,18 +34,23 @@ spec:
33
34
  npm install -g underpost &&
34
35
  underpost secret underpost --create-from-file /etc/config/.env.development &&
35
36
  underpost start --build --run dd-test development
37
+
36
38
  volumeMounts:
37
- - name: config-volume
39
+ - name: config-volume-dd-test-development-blue
38
40
  mountPath: /etc/config
41
+
39
42
  volumes:
40
- - name: config-volume
43
+ - name: config-volume-dd-test-development-blue
41
44
  configMap:
42
45
  name: underpost-config
46
+
47
+
43
48
  ---
44
49
  apiVersion: v1
45
50
  kind: Service
46
51
  metadata:
47
52
  name: dd-test-development-blue-service
53
+ namespace: default
48
54
  spec:
49
55
  selector:
50
56
  app: dd-test-development-blue
@@ -90,6 +96,7 @@ apiVersion: apps/v1
90
96
  kind: Deployment
91
97
  metadata:
92
98
  name: dd-test-development-green
99
+ namespace: default
93
100
  labels:
94
101
  app: dd-test-development-green
95
102
  spec:
@@ -104,7 +111,7 @@ spec:
104
111
  spec:
105
112
  containers:
106
113
  - name: dd-test-development-green
107
- image: localhost/rockylinux9-underpost:v2.89.2
114
+ image: localhost/rockylinux9-underpost:v2.89.45
108
115
  # resources:
109
116
  # requests:
110
117
  # memory: "96294Ki"
@@ -120,18 +127,23 @@ spec:
120
127
  npm install -g underpost &&
121
128
  underpost secret underpost --create-from-file /etc/config/.env.development &&
122
129
  underpost start --build --run dd-test development
130
+
123
131
  volumeMounts:
124
- - name: config-volume
132
+ - name: config-volume-dd-test-development-green
125
133
  mountPath: /etc/config
134
+
126
135
  volumes:
127
- - name: config-volume
136
+ - name: config-volume-dd-test-development-green
128
137
  configMap:
129
138
  name: underpost-config
139
+
140
+
130
141
  ---
131
142
  apiVersion: v1
132
143
  kind: Service
133
144
  metadata:
134
145
  name: dd-test-development-green-service
146
+ namespace: default
135
147
  spec:
136
148
  selector:
137
149
  app: dd-test-development-green
@@ -4,6 +4,7 @@ apiVersion: projectcontour.io/v1
4
4
  kind: HTTPProxy
5
5
  metadata:
6
6
  name: test.nexodev.org
7
+ namespace: default
7
8
  spec:
8
9
  virtualhost:
9
10
  fqdn: test.nexodev.org
@@ -31,6 +32,7 @@ apiVersion: projectcontour.io/v1
31
32
  kind: HTTPProxy
32
33
  metadata:
33
34
  name: stagging.nexodev.org
35
+ namespace: default
34
36
  spec:
35
37
  virtualhost:
36
38
  fqdn: stagging.nexodev.org
@@ -2,7 +2,6 @@ apiVersion: apps/v1
2
2
  kind: StatefulSet
3
3
  metadata:
4
4
  name: kafka
5
- namespace: kafka
6
5
  labels:
7
6
  app: kafka-app
8
7
  spec:
@@ -54,7 +53,6 @@ apiVersion: v1
54
53
  kind: Service
55
54
  metadata:
56
55
  name: kafka-svc
57
- namespace: kafka
58
56
  labels:
59
57
  app: kafka-app
60
58
  spec:
@@ -2,7 +2,6 @@ apiVersion: sparkoperator.k8s.io/v1beta2
2
2
  kind: SparkApplication
3
3
  metadata:
4
4
  name: spark-pi-python
5
- namespace: default
6
5
  spec:
7
6
  type: Python
8
7
  pythonVersion: '3'
@@ -3,7 +3,6 @@ apiVersion: v1
3
3
  kind: ConfigMap
4
4
  metadata:
5
5
  name: tf-gpu-test-script
6
- namespace: default
7
6
  data:
8
7
  main_tf_gpu_test.py: |
9
8
  import os
@@ -37,7 +36,6 @@ apiVersion: v1
37
36
  kind: Pod
38
37
  metadata:
39
38
  name: tf-gpu-test-pod
40
- namespace: default
41
39
  spec:
42
40
  restartPolicy: Never
43
41
  runtimeClassName: nvidia
@@ -4,7 +4,6 @@ metadata:
4
4
  labels:
5
5
  app: envoy
6
6
  name: envoy
7
- namespace: projectcontour
8
7
  spec:
9
8
  externalTrafficPolicy: Cluster
10
9
  ports:
@@ -1,119 +1,14 @@
1
- # This consolidated YAML file contains configurations for:
2
- # 1. Calico Installation (Installation and APIServer resources)
3
- # 2. A permissive Egress NetworkPolicy for the 'default' namespace
4
- #
5
- # These are standard Kubernetes resources that can be applied directly using 'kubectl apply'.
6
- # The kubeadm-specific ClusterConfiguration and InitConfiguration have been removed
7
- # as they are only processed by the 'kubeadm init' command, not 'kubectl apply'.
8
-
9
- # --- Calico Installation: Base configuration for Calico ---
10
- # For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.Installation
11
- apiVersion: operator.tigera.io/v1
12
- kind: Installation
1
+ apiVersion: crd.projectcalico.org/v1
2
+ kind: GlobalNetworkPolicy
13
3
  metadata:
14
- name: default
4
+ name: allow-all-egress-cluster
15
5
  spec:
16
- # Configures Calico networking.
17
- calicoNetwork:
18
- # Note: The ipPools section cannot be modified post-install.
19
- ipPools:
20
- - blockSize: 26
21
- cidr: 192.168.0.0/16
22
- encapsulation: VXLANCrossSubnet
23
- natOutgoing: Enabled
24
- nodeSelector: all()
25
-
26
- ---
27
- # This section configures the Calico API server.
28
- # For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.APIServer
29
- apiVersion: operator.tigera.io/v1
30
- kind: APIServer
31
- metadata:
32
- name: default
33
- spec: {}
34
-
35
- ---
36
- # This consolidated NetworkPolicy file ensures that all pods in the specified namespaces
37
- # have unrestricted egress (outbound) access.
38
- # This is useful for troubleshooting or for environments where strict egress control
39
- # is not immediately required for these system/default namespaces.
40
-
41
- ---
42
- # Policy for the 'default' namespace
43
- apiVersion: networking.k8s.io/v1
44
- kind: NetworkPolicy
45
- metadata:
46
- name: allow-all-egress-default-namespace
47
- namespace: default # This policy applies to the 'default' namespace
48
- spec:
49
- podSelector: {} # Selects all pods in this namespace
50
- policyTypes:
51
- - Egress
52
- egress:
53
- - to:
54
- - ipBlock:
55
- cidr: 0.0.0.0/0 # Allows traffic to any IPv4 address
56
-
57
- ---
58
- # Policy for the 'kube-system' namespace
59
- apiVersion: networking.k8s.io/v1
60
- kind: NetworkPolicy
61
- metadata:
62
- name: allow-all-egress-kube-system-namespace
63
- namespace: kube-system # This policy applies to the 'kube-system' namespace
64
- spec:
65
- podSelector: {} # Selects all pods in this namespace
66
- policyTypes:
67
- - Egress
68
- egress:
69
- - to:
70
- - ipBlock:
71
- cidr: 0.0.0.0/0 # Allows traffic to any IPv4 address
72
-
73
- ---
74
- # Policy for the 'kube-node-lease' namespace
75
- apiVersion: networking.k8s.io/v1
76
- kind: NetworkPolicy
77
- metadata:
78
- name: allow-all-egress-kube-node-lease-namespace
79
- namespace: kube-node-lease # This policy applies to the 'kube-node-lease' namespace
80
- spec:
81
- podSelector: {} # Selects all pods in this namespace
82
- policyTypes:
83
- - Egress
84
- egress:
85
- - to:
86
- - ipBlock:
87
- cidr: 0.0.0.0/0 # Allows traffic to any IPv4 address
88
-
89
- ---
90
- # Policy for the 'kube-public' namespace
91
- apiVersion: networking.k8s.io/v1
92
- kind: NetworkPolicy
93
- metadata:
94
- name: allow-all-egress-kube-public-namespace
95
- namespace: kube-public # This policy applies to the 'kube-public' namespace
96
- spec:
97
- podSelector: {} # Selects all pods in this namespace
98
- policyTypes:
99
- - Egress
100
- egress:
101
- - to:
102
- - ipBlock:
103
- cidr: 0.0.0.0/0 # Allows traffic to any IPv4 address
104
-
105
- ---
106
- # Policy for the 'tigera-operator' namespace
107
- apiVersion: networking.k8s.io/v1
108
- kind: NetworkPolicy
109
- metadata:
110
- name: allow-all-egress-tigera-operator-namespace
111
- namespace: tigera-operator # This policy applies to the 'tigera-operator' namespace
112
- spec:
113
- podSelector: {} # Selects all pods in this namespace
114
- policyTypes:
6
+ selector: all()
7
+ order: 1000
8
+ types:
115
9
  - Egress
116
10
  egress:
117
- - to:
118
- - ipBlock:
119
- cidr: 0.0.0.0/0 # Allows traffic to any IPv4 address
11
+ - action: Allow
12
+ destination:
13
+ nets:
14
+ - 0.0.0.0/0
@@ -2,7 +2,6 @@ apiVersion: cert-manager.io/v1
2
2
  kind: ClusterIssuer
3
3
  metadata:
4
4
  name: letsencrypt-prod
5
- namespace: cert-manager
6
5
  spec:
7
6
  acme:
8
7
  email: development@underpost.net
@@ -49,7 +49,7 @@ spec:
49
49
  - metadata:
50
50
  name: mariadb-storage
51
51
  spec:
52
- accessModes: ["ReadWriteOnce"]
52
+ accessModes: ['ReadWriteOnce']
53
53
  storageClassName: mariadb-storage-class
54
54
  resources:
55
55
  requests:
@@ -3,7 +3,7 @@ kind: StatefulSet
3
3
  metadata:
4
4
  name: mongodb # Specifies the name of the statefulset
5
5
  spec:
6
- serviceName: "mongodb-service" # Specifies the service to use
6
+ serviceName: 'mongodb-service' # Specifies the service to use
7
7
  replicas: 2
8
8
  selector:
9
9
  matchLabels:
@@ -18,8 +18,8 @@ spec:
18
18
  image: docker.io/library/mongo:latest
19
19
  command:
20
20
  - mongod
21
- - "--replSet"
22
- - "rs0"
21
+ - '--replSet'
22
+ - 'rs0'
23
23
  # - '--config'
24
24
  # - '-f'
25
25
  # - '/etc/mongod.conf'
@@ -35,9 +35,9 @@ spec:
35
35
  # - '--setParameter'
36
36
  # - 'authenticationMechanisms=SCRAM-SHA-1'
37
37
  # - '--fork'
38
- - "--logpath"
39
- - "/var/log/mongodb/mongod.log"
40
- - "--bind_ip_all"
38
+ - '--logpath'
39
+ - '/var/log/mongodb/mongod.log'
40
+ - '--bind_ip_all'
41
41
  # command: ['sh', '-c']
42
42
  # args:
43
43
  # - |
@@ -99,11 +99,11 @@ spec:
99
99
  key: password
100
100
  resources:
101
101
  requests:
102
- cpu: "100m"
103
- memory: "256Mi"
102
+ cpu: '100m'
103
+ memory: '256Mi'
104
104
  limits:
105
- cpu: "500m"
106
- memory: "512Mi"
105
+ cpu: '500m'
106
+ memory: '512Mi'
107
107
  volumes:
108
108
  - name: keyfile
109
109
  secret:
@@ -119,7 +119,7 @@ spec:
119
119
  - metadata:
120
120
  name: mongodb-storage
121
121
  spec:
122
- accessModes: ["ReadWriteOnce"]
122
+ accessModes: ['ReadWriteOnce']
123
123
  storageClassName: mongodb-storage-class
124
124
  resources:
125
125
  requests:
@@ -2,7 +2,6 @@ apiVersion: apps/v1
2
2
  kind: Deployment
3
3
  metadata:
4
4
  name: mongodb-deployment
5
- namespace: default
6
5
  spec:
7
6
  selector:
8
7
  matchLabels:
@@ -17,7 +16,7 @@ spec:
17
16
  containers:
18
17
  - name: mongodb
19
18
  image: mongo:4.4
20
- command: ["mongod", "--replSet", "rs0", "--bind_ip_all"]
19
+ command: ['mongod', '--replSet', 'rs0', '--bind_ip_all']
21
20
  # -- bash
22
21
  # mongo
23
22
  # use admin
@@ -43,7 +42,6 @@ apiVersion: v1
43
42
  kind: Service
44
43
  metadata:
45
44
  name: mongodb-service
46
- namespace: default
47
45
  spec:
48
46
  clusterIP: None
49
47
  selector:
@@ -12,7 +12,7 @@ spec:
12
12
  accessModes:
13
13
  - ReadWriteOnce
14
14
  hostPath:
15
- path: "/mnt/data"
15
+ path: '/mnt/data'
16
16
  ---
17
17
  apiVersion: v1
18
18
  kind: PersistentVolumeClaim
@@ -17,7 +17,7 @@ kind: StatefulSet
17
17
  metadata:
18
18
  name: mysql
19
19
  spec:
20
- serviceName: "mysql"
20
+ serviceName: 'mysql'
21
21
  selector:
22
22
  matchLabels:
23
23
  app: mysql
@@ -0,0 +1,34 @@
1
+ apiVersion: v1
2
+ kind: PersistentVolume
3
+ metadata:
4
+ name: pv-dd
5
+ spec:
6
+ capacity:
7
+ storage: 5Gi
8
+ accessModes:
9
+ - ReadWriteOnce
10
+ persistentVolumeReclaimPolicy: Retain
11
+ storageClassName: manual
12
+ hostPath:
13
+ path: /home/dd
14
+ type: DirectoryOrCreate
15
+ # nodeAffinity:
16
+ # required:
17
+ # nodeSelectorTerms:
18
+ # - matchExpressions:
19
+ # - key: kubernetes.io/hostname
20
+ # operator: In
21
+ # values:
22
+ # - localhost
23
+ ---
24
+ apiVersion: v1
25
+ kind: PersistentVolumeClaim
26
+ metadata:
27
+ name: pvc-dd
28
+ spec:
29
+ accessModes:
30
+ - ReadWriteOnce
31
+ storageClassName: manual
32
+ resources:
33
+ requests:
34
+ storage: 1Gi
@@ -2,7 +2,6 @@ apiVersion: v1
2
2
  kind: Service
3
3
  metadata:
4
4
  name: valkey-service
5
- namespace: default
6
5
  spec:
7
6
  selector:
8
7
  app: valkey-service
@@ -2,7 +2,6 @@ apiVersion: apps/v1
2
2
  kind: StatefulSet
3
3
  metadata:
4
4
  name: valkey-service
5
- namespace: default
6
5
  spec:
7
6
  serviceName: valkey-service
8
7
  replicas: 1
@@ -19,8 +18,8 @@ spec:
19
18
  - name: valkey-service
20
19
  image: docker.io/valkey/valkey:latest
21
20
  imagePullPolicy: IfNotPresent
22
- command: ["valkey-server"]
23
- args: ["--port", "6379"]
21
+ command: ['valkey-server']
22
+ args: ['--port', '6379']
24
23
  ports:
25
24
  - containerPort: 6379
26
25
  startupProbe:
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "type": "module",
3
3
  "main": "src/index.js",
4
4
  "name": "cyberia",
5
- "version": "2.89.2",
5
+ "version": "2.89.45",
6
6
  "description": "Cyberia Engine - Object Layer and Assets Management Microservice",
7
7
  "scripts": {
8
8
  "start": "env-cmd -f .env.production node --max-old-space-size=8192 src/server",
package/proxy.yaml CHANGED
@@ -4,6 +4,7 @@ apiVersion: projectcontour.io/v1
4
4
  kind: HTTPProxy
5
5
  metadata:
6
6
  name: www.cyberiaonline.com
7
+ namespace: default
7
8
  spec:
8
9
  virtualhost:
9
10
  fqdn: www.cyberiaonline.com
@@ -31,6 +32,7 @@ apiVersion: projectcontour.io/v1
31
32
  kind: HTTPProxy
32
33
  metadata:
33
34
  name: cyberiaonline.com
35
+ namespace: default
34
36
  spec:
35
37
  virtualhost:
36
38
  fqdn: cyberiaonline.com
@@ -49,6 +51,7 @@ apiVersion: projectcontour.io/v1
49
51
  kind: HTTPProxy
50
52
  metadata:
51
53
  name: cryptokoyn.net
54
+ namespace: default
52
55
  spec:
53
56
  virtualhost:
54
57
  fqdn: cryptokoyn.net
@@ -76,6 +79,7 @@ apiVersion: projectcontour.io/v1
76
79
  kind: HTTPProxy
77
80
  metadata:
78
81
  name: www.cryptokoyn.net
82
+ namespace: default
79
83
  spec:
80
84
  virtualhost:
81
85
  fqdn: www.cryptokoyn.net
@@ -94,6 +98,7 @@ apiVersion: projectcontour.io/v1
94
98
  kind: HTTPProxy
95
99
  metadata:
96
100
  name: itemledger.com
101
+ namespace: default
97
102
  spec:
98
103
  virtualhost:
99
104
  fqdn: itemledger.com
@@ -121,6 +126,7 @@ apiVersion: projectcontour.io/v1
121
126
  kind: HTTPProxy
122
127
  metadata:
123
128
  name: www.itemledger.com
129
+ namespace: default
124
130
  spec:
125
131
  virtualhost:
126
132
  fqdn: www.itemledger.com
@@ -1,26 +1,42 @@
1
1
  #!/usr/bin/env bash
2
+ set -u -o pipefail
2
3
 
3
4
  for iface_path in /sys/class/net/*; do
5
+ [ -e "$iface_path" ] || continue
4
6
  name=$(basename "$iface_path")
5
- mac=$(< "$iface_path/address")
6
- ip=$(ip -4 addr show dev "$name" \
7
- | grep -oP '(?<=inet\s)\d+(\.\d+){3}' || echo "—")
8
- operstate=$(< "$iface_path/operstate")
9
- mtu=$(< "$iface_path/mtu")
10
-
11
- # Driver
12
- if [ -L "$iface_path/device/driver" ]; then
7
+
8
+ # MAC address
9
+ if [ -r "$iface_path/address" ]; then
10
+ mac=$(< "$iface_path/address")
11
+ else
12
+ mac="—"
13
+ fi
14
+
15
+ # IPv4: collect all IPv4 CIDRs, strip masks, join with commas (or show —)
16
+ ip_info=$(ip -4 -o addr show dev "$name" 2>/dev/null | awk '{print $4}')
17
+ if [ -n "$ip_info" ]; then
18
+ # Use word-splitting intentionally to iterate lines from ip_info
19
+ ip=$(printf "%s\n" $ip_info | awk -F/ '{print $1}' | paste -sd, -)
20
+ else
21
+ ip="—"
22
+ fi
23
+
24
+ # operstate and mtu
25
+ operstate=$(< "$iface_path/operstate" 2>/dev/null || echo "—")
26
+ mtu=$(< "$iface_path/mtu" 2>/dev/null || echo "—")
27
+
28
+ # Driver (if available)
29
+ if [ -e "$iface_path/device/driver" ]; then
13
30
  driver=$(basename "$(readlink -f "$iface_path/device/driver")")
14
31
  else
15
32
  driver="—"
16
33
  fi
17
34
 
18
- # Vendor device ID PCI
35
+ # PCI vendor:device (if available)
19
36
  pci_dev="$iface_path/device"
20
- if [ -f "$pci_dev/vendor" ] && [ -f "$pci_dev/device" ]; then
37
+ if [ -r "$pci_dev/vendor" ] && [ -r "$pci_dev/device" ]; then
21
38
  vendor_id=$(< "$pci_dev/vendor")
22
39
  device_id=$(< "$pci_dev/device")
23
- # parse 0x8086 to 8086, etc.
24
40
  vendor_id=${vendor_id#0x}
25
41
  device_id=${device_id#0x}
26
42
  pci="${vendor_id}:${device_id}"
@@ -28,16 +44,22 @@ for iface_path in /sys/class/net/*; do
28
44
  pci="—"
29
45
  fi
30
46
 
31
- # Link Speed
47
+ # Link speed: only append unit if numeric
32
48
  speed=$(cat "$iface_path/speed" 2>/dev/null || echo "—")
49
+ if [[ "$speed" =~ ^[0-9]+$ ]]; then
50
+ speed_label="${speed} Mb/s"
51
+ else
52
+ speed_label="$speed"
53
+ fi
54
+
55
+ # Print formatted output
56
+ printf 'Interface: %s\n' "$name"
57
+ printf ' MAC: %s\n' "$mac"
58
+ printf ' IPv4: %s\n' "$ip"
59
+ printf ' State: %s\n' "$operstate"
60
+ printf ' MTU: %s\n' "$mtu"
61
+ printf ' Driver: %s\n' "$driver"
62
+ printf ' PCI Vendor:Device: %s\n' "$pci"
63
+ printf ' Link Speed: %s\n\n' "$speed_label"
33
64
 
34
- echo "Interface: $name"
35
- echo " MAC: $mac"
36
- echo " IPv4: $ip"
37
- echo " State: $operstate"
38
- echo " MTU: $mtu"
39
- echo " Driver: $driver"
40
- echo " PCI Vendor:Device ID: $pci"
41
- echo " Link Speed: ${speed}Mb/s"
42
- echo
43
65
  done
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bash
2
+ # gen-fqdns.sh - generate a readable plain table with FQDNs for all services and pods in the cluster
3
+
4
+ set -euo pipefail
5
+
6
+ CLUSTER_DOMAIN="${CLUSTER_DOMAIN:-cluster.local}"
7
+
8
+ # Services: <service>.<namespace>.svc.<cluster-domain>
9
+ kubectl get svc --all-namespaces -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name --no-headers \
10
+ | awk -v cd="$CLUSTER_DOMAIN" '{printf "%-20s %-34s %-6s %s.%s.svc.%s\n", $1, $2, "svc", $2, $1, cd}'
11
+
12
+ # Pods: <pod>.<namespace>.pod.<cluster-domain>
13
+ kubectl get pods --all-namespaces -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name --no-headers \
14
+ | awk -v cd="$CLUSTER_DOMAIN" '{printf "%-20s %-34s %-6s %s.%s.pod.%s\n", $1, $2, "pod", $2, $1, cd}'