Skip to content

Commit 1cefa38

Browse files
committed
Merge branch 'main' into workflow-release-updater
2 parents b559348 + b1947ec commit 1cefa38

23 files changed

+1619
-925
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ permissions:
2020

2121
env:
2222
NFPM_VERSION: 'v2.35.3'
23-
GOPROXY: "https://${{ secrets.ARTIFACTORY_USER }}:${{ secrets.ARTIFACTORY_TOKEN }}@azr.artifactory.f5net.com/artifactory/api/go/f5-nginx-go-dev"
23+
GOPROXY: "direct"
2424

2525
jobs:
2626
proxy-sanity-check:

.github/workflows/release-branch.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ jobs:
9696
ref: ${{ inputs.releaseBranch }}
9797

9898
- name: Setup Node Environment
99-
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
99+
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
100100

101101
- name: Create Draft Release
102102
if: ${{ needs.vars.outputs.github_release == 'true' }}

.github/workflows/scorecards.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,6 @@ jobs:
5555

5656
# Upload the results to GitHub's code scanning dashboard.
5757
- name: "Upload to code-scanning"
58-
uses: github/codeql-action/upload-sarif@f443b600d91635bebf5b0d9ebc620189c0d6fba5 # v4.30.8
58+
uses: github/codeql-action/upload-sarif@16140ae1a102900babc80a33c44059580f687047 # v4.30.9
5959
with:
6060
sarif_file: results.sarif

go.mod

Lines changed: 205 additions & 188 deletions
Large diffs are not rendered by default.

go.sum

Lines changed: 521 additions & 449 deletions
Large diffs are not rendered by default.

internal/collector/otel_collector_plugin.go

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ func (oc *Collector) updateNginxAppProtectTcplogReceivers(
613613
oc.config.Collector.Receivers.TcplogReceivers = make(map[string]*config.TcplogReceiver)
614614
}
615615

616-
napSysLogServer := oc.findAvailableSyslogServers(ctx, nginxConfigContext.NAPSysLogServers)
616+
napSysLogServer := oc.findAvailableSyslogServer(ctx, nginxConfigContext.NAPSysLogServer)
617617

618618
if napSysLogServer != "" {
619619
if !oc.doesTcplogReceiverAlreadyExist(napSysLogServer) {
@@ -746,40 +746,29 @@ func (oc *Collector) updateResourceAttributes(
746746
return actionUpdated
747747
}
748748

749-
func (oc *Collector) findAvailableSyslogServers(ctx context.Context, napSyslogServers []string) string {
750-
napSyslogServersMap := make(map[string]bool)
751-
for _, server := range napSyslogServers {
752-
napSyslogServersMap[server] = true
753-
}
754-
755-
if oc.previousNAPSysLogServer != "" {
756-
if _, ok := napSyslogServersMap[oc.previousNAPSysLogServer]; ok {
757-
return oc.previousNAPSysLogServer
758-
}
749+
func (oc *Collector) findAvailableSyslogServer(ctx context.Context, napSyslogServer string) string {
750+
if oc.previousNAPSysLogServer != "" &&
751+
normaliseAddress(oc.previousNAPSysLogServer) == normaliseAddress(napSyslogServer) {
752+
return napSyslogServer
759753
}
760754

761-
for _, napSyslogServer := range napSyslogServers {
762-
listenConfig := &net.ListenConfig{}
763-
ln, err := listenConfig.Listen(ctx, "tcp", napSyslogServer)
764-
if err != nil {
765-
slog.DebugContext(ctx, "NAP syslog server is not reachable", "address", napSyslogServer,
766-
"error", err)
767-
768-
continue
769-
}
770-
closeError := ln.Close()
771-
if closeError != nil {
772-
slog.DebugContext(ctx, "Failed to close syslog server", "address", napSyslogServer, "error", closeError)
773-
}
774-
775-
slog.DebugContext(ctx, "Found valid NAP syslog server", "address", napSyslogServer)
755+
listenConfig := &net.ListenConfig{}
756+
ln, err := listenConfig.Listen(ctx, "tcp", napSyslogServer)
757+
if err != nil {
758+
slog.DebugContext(ctx, "NAP syslog server is not reachable", "address", napSyslogServer,
759+
"error", err)
776760

777-
oc.previousNAPSysLogServer = napSyslogServer
761+
return ""
762+
}
778763

779-
return napSyslogServer
764+
closeError := ln.Close()
765+
if closeError != nil {
766+
slog.DebugContext(ctx, "Failed to close syslog server", "address", napSyslogServer, "error", closeError)
780767
}
781768

782-
return ""
769+
oc.previousNAPSysLogServer = napSyslogServer
770+
771+
return napSyslogServer
783772
}
784773

785774
func isOSSReceiverChanged(nginxReceiver config.NginxReceiver, nginxConfigContext *model.NginxConfigContext) bool {
@@ -865,3 +854,16 @@ func setProxyWithBasicAuth(ctx context.Context, proxy *config.Proxy, parsedProxy
865854
proxyURL := parsedProxyURL.String()
866855
setProxyEnvs(ctx, proxyURL, "Setting Proxy with basic auth")
867856
}
857+
858+
func normaliseAddress(address string) string {
859+
host, port, err := net.SplitHostPort(address)
860+
if err != nil {
861+
return address
862+
}
863+
864+
if host == "localhost" {
865+
host = "127.0.0.1"
866+
}
867+
868+
return net.JoinHostPort(host, port)
869+
}

internal/collector/otel_collector_plugin_test.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -753,7 +753,7 @@ func TestCollector_updateNginxAppProtectTcplogReceivers(t *testing.T) {
753753
require.NoError(t, err)
754754

755755
nginxConfigContext := &model.NginxConfigContext{
756-
NAPSysLogServers: []string{"localhost:15632"},
756+
NAPSysLogServer: "localhost:15632",
757757
}
758758

759759
assert.Empty(t, conf.Collector.Receivers.TcplogReceivers)
@@ -786,7 +786,7 @@ func TestCollector_updateNginxAppProtectTcplogReceivers(t *testing.T) {
786786
t.Run("Test 4: NewCollector tcplogReceiver added and deleted another", func(tt *testing.T) {
787787
tcplogReceiverDeleted := collector.updateNginxAppProtectTcplogReceivers(ctx,
788788
&model.NginxConfigContext{
789-
NAPSysLogServers: []string{"localhost:1555"},
789+
NAPSysLogServer: "localhost:1555",
790790
},
791791
)
792792

@@ -939,49 +939,49 @@ func TestCollector_findAvailableSyslogServers(t *testing.T) {
939939
name string
940940
expectedSyslogServer string
941941
previousNAPSysLogServer string
942-
syslogServers []string
942+
syslogServers string
943943
portInUse bool
944944
}{
945945
{
946946
name: "Test 1: port available",
947947
expectedSyslogServer: "localhost:15632",
948948
previousNAPSysLogServer: "",
949-
syslogServers: []string{"localhost:15632"},
949+
syslogServers: "localhost:15632",
950950
portInUse: false,
951951
},
952952
{
953953
name: "Test 2: port in use",
954954
expectedSyslogServer: "",
955955
previousNAPSysLogServer: "",
956-
syslogServers: []string{"localhost:15632"},
956+
syslogServers: "localhost:15632",
957957
portInUse: true,
958958
},
959959
{
960960
name: "Test 3: syslog server already configured",
961961
expectedSyslogServer: "localhost:15632",
962962
previousNAPSysLogServer: "localhost:15632",
963-
syslogServers: []string{"localhost:15632"},
963+
syslogServers: "localhost:15632",
964964
portInUse: false,
965965
},
966966
{
967967
name: "Test 4: new syslog server",
968968
expectedSyslogServer: "localhost:15632",
969969
previousNAPSysLogServer: "localhost:1122",
970-
syslogServers: []string{"localhost:15632"},
970+
syslogServers: "localhost:15632",
971971
portInUse: false,
972972
},
973973
{
974-
name: "Test 5: port in use find next server",
974+
name: "Test 6: port hasn't changed",
975975
expectedSyslogServer: "localhost:1122",
976-
previousNAPSysLogServer: "",
977-
syslogServers: []string{"localhost:15632", "localhost:1122"},
976+
previousNAPSysLogServer: "localhost:1122",
977+
syslogServers: "localhost:1122",
978978
portInUse: true,
979979
},
980980
{
981-
name: "Test 6: port hasn't changed",
981+
name: "Test 7: port hasn't changed, but is now localhost",
982982
expectedSyslogServer: "localhost:1122",
983-
previousNAPSysLogServer: "localhost:1122",
984-
syslogServers: []string{"localhost:1122"},
983+
previousNAPSysLogServer: "127.0.0.1:1122",
984+
syslogServers: "localhost:1122",
985985
portInUse: true,
986986
},
987987
}
@@ -994,12 +994,12 @@ func TestCollector_findAvailableSyslogServers(t *testing.T) {
994994

995995
if test.portInUse {
996996
listenConfig := &net.ListenConfig{}
997-
ln, listenError := listenConfig.Listen(ctx, "tcp", "localhost:15632")
997+
ln, listenError := listenConfig.Listen(ctx, "tcp", test.syslogServers)
998998
require.NoError(t, listenError)
999999
defer ln.Close()
10001000
}
10011001

1002-
actual := collector.findAvailableSyslogServers(ctx, test.syslogServers)
1002+
actual := collector.findAvailableSyslogServer(ctx, test.syslogServers)
10031003
assert.Equal(tt, test.expectedSyslogServer, actual)
10041004
})
10051005
}

internal/config/config.go

Lines changed: 77 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ const (
4646

4747
// Regular expression to match invalid characters in paths.
4848
// It matches whitespace, control characters, non-printable characters, and specific Unicode characters.
49-
regexInvalidPath = "\\s|[[:cntrl:]]|[[:space:]]|[[^:print:]]|ㅤ|\\.\\.|\\*"
49+
regexInvalidPath = "\\s|[[:cntrl:]]|[[:space:]]|[[^:print:]]|ㅤ|\\.\\.|\\*"
50+
regexLabelPattern = "^[a-zA-Z0-9]([a-zA-Z0-9-_]{0,254}[a-zA-Z0-9])?$"
5051
)
5152

5253
var viperInstance = viper.NewWithOptions(viper.KeyDelimiter(KeyDelimiter))
@@ -63,6 +64,40 @@ func Execute(ctx context.Context) error {
6364
func Init(version, commit string) {
6465
setVersion(version, commit)
6566
registerFlags()
67+
checkDeprecatedEnvVars()
68+
}
69+
70+
func checkDeprecatedEnvVars() {
71+
allViperKeys := make(map[string]struct{})
72+
for _, key := range viperInstance.AllKeys() {
73+
allViperKeys[key] = struct{}{}
74+
}
75+
76+
const v3Prefix = EnvPrefix + KeyDelimiter
77+
78+
for _, env := range os.Environ() {
79+
parts := strings.SplitN(env, "=", KeyValueNumber)
80+
if len(parts) != KeyValueNumber {
81+
continue
82+
}
83+
envKey := parts[0]
84+
85+
if !strings.HasPrefix(envKey, v3Prefix) {
86+
continue
87+
}
88+
89+
viperKey := strings.TrimPrefix(envKey, v3Prefix)
90+
91+
viperKey = strings.ToLower(viperKey)
92+
93+
if _, exists := allViperKeys[viperKey]; !exists {
94+
slog.Warn("Detected deprecated or unknown environment variables. "+
95+
"Please update to use the latest environment variables. For more information, visit "+
96+
"https://docs.nginx.com/nginx-one/agent/configure-instances/configuration-overview/.",
97+
"deprecated_env_var", envKey,
98+
)
99+
}
100+
}
66101
}
67102

68103
func RegisterConfigFile() error {
@@ -122,6 +157,7 @@ func ResolveConfig() (*Config, error) {
122157
Features: viperInstance.GetStringSlice(FeaturesKey),
123158
Labels: resolveLabels(),
124159
LibDir: viperInstance.GetString(LibDirPathKey),
160+
SyslogServer: resolveSyslogServer(),
125161
}
126162

127163
defaultCollector(collector, config)
@@ -427,6 +463,12 @@ func registerFlags() {
427463
"A comma-separated list of features enabled for the agent.",
428464
)
429465

466+
fs.String(
467+
SyslogServerPort,
468+
DefSyslogServerPort,
469+
"The port Agent will start the syslog server on for logs collection",
470+
)
471+
430472
registerCommonFlags(fs)
431473
registerCommandFlags(fs)
432474
registerAuxiliaryCommandFlags(fs)
@@ -586,6 +628,12 @@ func registerClientFlags(fs *flag.FlagSet) {
586628
DefMaxFileSize,
587629
"Max file size in bytes.",
588630
)
631+
632+
fs.Int(
633+
ClientGRPCMaxParallelFileOperationsKey,
634+
DefMaxParallelFileOperations,
635+
"Maximum number of file downloads or uploads performed in parallel",
636+
)
589637
}
590638

591639
func registerCommandFlags(fs *flag.FlagSet) {
@@ -912,6 +960,12 @@ func resolveLog() *Log {
912960
}
913961
}
914962

963+
func resolveSyslogServer() *SyslogServer {
964+
return &SyslogServer{
965+
Port: viperInstance.GetString(SyslogServerPort),
966+
}
967+
}
968+
915969
func resolveLabels() map[string]interface{} {
916970
input := viperInstance.GetStringMapString(LabelsRootKey)
917971

@@ -946,7 +1000,9 @@ func resolveLabels() map[string]interface{} {
9461000
result[trimmedKey] = parseJSON(trimmedValue)
9471001

9481002
default: // String
949-
result[trimmedKey] = trimmedValue
1003+
if validateLabel(trimmedValue) {
1004+
result[trimmedKey] = trimmedValue
1005+
}
9501006
}
9511007
}
9521008

@@ -955,6 +1011,19 @@ func resolveLabels() map[string]interface{} {
9551011
return result
9561012
}
9571013

1014+
func validateLabel(labelValue string) bool {
1015+
const maxLength = 256
1016+
labelPattern := regexp.MustCompile(regexLabelPattern)
1017+
if len(labelValue) > maxLength || !labelPattern.MatchString(labelValue) {
1018+
slog.Warn("Label value contains unsupported character or exceed maximum length of 256 characters ",
1019+
"label_value", labelValue)
1020+
1021+
return false
1022+
}
1023+
1024+
return true
1025+
}
1026+
9581027
func resolveEnvironmentVariableLabels() map[string]string {
9591028
envLabels := make(map[string]string)
9601029
envInput := viperInstance.GetString(LabelsRootKey)
@@ -1037,11 +1106,12 @@ func resolveClient() *Client {
10371106
Time: viperInstance.GetDuration(ClientKeepAliveTimeKey),
10381107
PermitWithoutStream: viperInstance.GetBool(ClientKeepAlivePermitWithoutStreamKey),
10391108
},
1040-
MaxMessageSize: viperInstance.GetInt(ClientGRPCMaxMessageSizeKey),
1041-
MaxMessageReceiveSize: viperInstance.GetInt(ClientGRPCMaxMessageReceiveSizeKey),
1042-
MaxMessageSendSize: viperInstance.GetInt(ClientGRPCMaxMessageSendSizeKey),
1043-
MaxFileSize: viperInstance.GetUint32(ClientGRPCMaxFileSizeKey),
1044-
FileChunkSize: viperInstance.GetUint32(ClientGRPCFileChunkSizeKey),
1109+
MaxMessageSize: viperInstance.GetInt(ClientGRPCMaxMessageSizeKey),
1110+
MaxMessageReceiveSize: viperInstance.GetInt(ClientGRPCMaxMessageReceiveSizeKey),
1111+
MaxMessageSendSize: viperInstance.GetInt(ClientGRPCMaxMessageSendSizeKey),
1112+
MaxFileSize: viperInstance.GetUint32(ClientGRPCMaxFileSizeKey),
1113+
FileChunkSize: viperInstance.GetUint32(ClientGRPCFileChunkSizeKey),
1114+
MaxParallelFileOperations: viperInstance.GetInt(ClientGRPCMaxParallelFileOperationsKey),
10451115
},
10461116
Backoff: &BackOff{
10471117
InitialInterval: viperInstance.GetDuration(ClientBackoffInitialIntervalKey),

0 commit comments

Comments
 (0)