Skip to content

Commit 972d891

Browse files
committed
Add option to provide list of DevEUIs.
Together with the other flags to disable migrating certain data this makes it possible to perform the migrations in several steps.
1 parent a6b7ff1 commit 972d891

File tree

1 file changed

+58
-13
lines changed

1 file changed

+58
-13
lines changed

main.go

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"bufio"
45
"bytes"
56
"context"
67
"crypto/tls"
@@ -10,6 +11,7 @@ import (
1011
"fmt"
1112
"io/ioutil"
1213
"log"
14+
"os"
1315
"strconv"
1416
"strings"
1517
"time"
@@ -30,6 +32,7 @@ import (
3032
var asConfigFile string
3133
var csConfigFile string
3234
var nsConfigFiles []string
35+
var devEUIListFile string
3336
var csSessionTTL int
3437
var dropTenantAndUsers bool
3538
var migrateUsers bool
@@ -42,15 +45,16 @@ var migrateGatewayMetrics bool
4245
var migrateDeviceMetrics bool
4346

4447
var (
45-
nsDB *sqlx.DB
46-
asDB *sqlx.DB
47-
csDB *sqlx.DB
48-
nsRedis redis.UniversalClient
49-
asRedis redis.UniversalClient
50-
csRedis redis.UniversalClient
51-
nsPrefix string
52-
asPrefix string
53-
csPrefix string
48+
nsDB *sqlx.DB
49+
asDB *sqlx.DB
50+
csDB *sqlx.DB
51+
nsRedis redis.UniversalClient
52+
asRedis redis.UniversalClient
53+
csRedis redis.UniversalClient
54+
nsPrefix string
55+
asPrefix string
56+
csPrefix string
57+
devEUIsList [][]byte
5458
)
5559

5660
var rootCmd = &cobra.Command{
@@ -80,6 +84,7 @@ func init() {
8084
rootCmd.PersistentFlags().StringVarP(&csConfigFile, "cs-config-file", "", "", "Path to chirpstack.toml configuration file")
8185
rootCmd.PersistentFlags().StringVarP(&asConfigFile, "as-config-file", "", "", "Path to chirpstack-application-server.toml configuration file")
8286
rootCmd.PersistentFlags().StringArrayVarP(&nsConfigFiles, "ns-config-file", "", []string{}, "Path to chirpstack-network-server.toml configuration file (can be repeated)")
87+
rootCmd.PersistentFlags().StringVarP(&devEUIListFile, "deveui-list-file", "", "", "Path to file containing DevEUIs to migrate (one DevEUI per line)")
8388
rootCmd.PersistentFlags().IntVarP(&csSessionTTL, "device-session-ttl-days", "", 31, "Device-session TTL in days")
8489
rootCmd.PersistentFlags().BoolVarP(&dropTenantAndUsers, "drop-tenants-and-users", "", false, "Drop tenants and users before migration")
8590
rootCmd.PersistentFlags().BoolVarP(&migrateUsers, "migrate-users", "", true, "Migrate users")
@@ -113,6 +118,39 @@ func run(cmd *cobra.Command, args []string) error {
113118
asDB = getPostgresClient(asConfig)
114119
asPrefix = asConfig.Redis.KeyPrefix
115120

121+
if devEUIListFile != "" {
122+
log.Printf("Reading DevEUI list file: %s", devEUIListFile)
123+
file, err := os.Open(devEUIListFile)
124+
if err != nil {
125+
log.Fatalf("Open DevEUI list file error: %s", err)
126+
}
127+
defer file.Close()
128+
129+
reader := bufio.NewReader(file)
130+
for {
131+
line, err := reader.ReadString('\n')
132+
if err != nil {
133+
break
134+
}
135+
136+
line = strings.TrimRight(line, "\n")
137+
if len(line) == 0 {
138+
continue
139+
}
140+
141+
if len(line) != 16 {
142+
log.Fatalf("Invalid DevEUI: '%s'", line)
143+
}
144+
145+
b, err := hex.DecodeString(line)
146+
if err != nil {
147+
log.Fatalf("Decode line error, line: '%s', error: %s", line, err)
148+
}
149+
150+
devEUIsList = append(devEUIsList, b)
151+
}
152+
}
153+
116154
log.Println("Start migration")
117155

118156
if dropTenantAndUsers {
@@ -1359,17 +1397,24 @@ func migrateDevicesFn() {
13591397
appSKeys := map[lorawan.EUI64]lorawan.AES128Key{}
13601398
nsDevices := []NSDevice{}
13611399
asDevices := []ASDevice{}
1362-
err := nsDB.Select(&nsDevices, "select * from device")
1363-
if err != nil {
1364-
log.Fatal("Select devices error", err)
1400+
if len(devEUIsList) == 0 {
1401+
err := nsDB.Select(&nsDevices, "select * from device")
1402+
if err != nil {
1403+
log.Fatal("Select devices error", err)
1404+
}
1405+
} else {
1406+
err := nsDB.Select(&nsDevices, "select * from device where dev_eui = any($1)", pq.ByteaArray(devEUIsList))
1407+
if err != nil {
1408+
log.Fatal("Select devices error", err)
1409+
}
13651410
}
13661411

13671412
var deviceIDs [][]byte
13681413
for i := range nsDevices {
13691414
deviceIDs = append(deviceIDs, nsDevices[i].DevEUI[:])
13701415
}
13711416

1372-
err = asDB.Select(&asDevices, "select * from device where dev_eui = any($1)", pq.ByteaArray(deviceIDs))
1417+
err := asDB.Select(&asDevices, "select * from device where dev_eui = any($1)", pq.ByteaArray(deviceIDs))
13731418
if err != nil {
13741419
log.Fatal("Select devices error", err)
13751420
}

0 commit comments

Comments
 (0)