11package main
22
33import (
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 (
3032var asConfigFile string
3133var csConfigFile string
3234var nsConfigFiles []string
35+ var devEUIListFile string
3336var csSessionTTL int
3437var dropTenantAndUsers bool
3538var migrateUsers bool
@@ -42,15 +45,16 @@ var migrateGatewayMetrics bool
4245var migrateDeviceMetrics bool
4346
4447var (
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
5660var 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