Skip to content

Commit b375095

Browse files
authored
collect more diagnostic information for feedback (#195)
1 parent c507cc4 commit b375095

File tree

4 files changed

+69
-28
lines changed

4 files changed

+69
-28
lines changed

ziti-android/src/main/java/org/openziti/android/Ziti.kt

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ import org.openziti.util.Version
4141
import org.openziti.util.ZitiLog
4242
import java.net.URI
4343
import java.security.KeyStore
44+
import java.security.cert.X509Certificate
45+
import java.util.concurrent.CompletableFuture
4446
import java.util.zip.ZipEntry
4547
import java.util.zip.ZipOutputStream
4648
import kotlin.coroutines.CoroutineContext
@@ -124,11 +126,8 @@ object Ziti: CoroutineScope, Logged by ZitiLog() {
124126
}
125127

126128
if (ctxList.isEmpty()) {
127-
val builder = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
129+
val builder =
128130
Notification.Builder(app, ZitiNotificationChannel)
129-
} else {
130-
Notification.Builder(app)
131-
}
132131

133132
val notification = builder
134133
.setSmallIcon(android.R.drawable.stat_sys_warning)
@@ -231,12 +230,51 @@ object Ziti: CoroutineScope, Logged by ZitiLog() {
231230

232231
val logDir = app.externalCacheDir!!.resolve("logs")
233232
logDir.mkdirs()
234-
val log = Runtime.getRuntime().exec("logcat -d -b crash,main").inputStream.bufferedReader().readText()
233+
val logcat = Runtime.getRuntime().exec("logcat -d -b crash,main")
234+
val log = CompletableFuture.supplyAsync { logcat.inputStream.bufferedReader().readText() }
235+
val err = CompletableFuture.supplyAsync { logcat.errorStream.bufferedReader().readText() }
236+
val logrc = CompletableFuture.supplyAsync { logcat.waitFor() }
235237

236238
val logFile = logDir.resolve("log.zip")
237239
val zip = ZipOutputStream(logFile.outputStream())
240+
zip.putNextEntry(ZipEntry("app.info"))
241+
val writer = zip.writer()
242+
243+
writer.write(bodyString)
244+
writer.flush()
245+
246+
zip.putNextEntry(ZipEntry("keystore.info"))
247+
for (a in keyStore.aliases()) {
248+
val entry = keyStore.getEntry(a, null)
249+
val cert = when(entry) {
250+
is KeyStore.TrustedCertificateEntry -> entry.trustedCertificate
251+
is KeyStore.PrivateKeyEntry -> entry.certificate
252+
else -> continue
253+
}
254+
255+
writer.appendLine()
256+
writer.appendLine("""
257+
name: $a
258+
type: ${entry.javaClass.simpleName}
259+
cert: ${cert.type} ${if (cert is X509Certificate)
260+
"Subject: ${cert.subjectDN} Issuer: ${cert.issuerDN}" else ""}
261+
""".trimIndent())
262+
}
263+
writer.flush()
264+
265+
identities.forEach {
266+
zip.putNextEntry(ZipEntry(it.name() + ".txt"))
267+
it.dump(writer)
268+
writer.flush()
269+
}
270+
238271
zip.putNextEntry(ZipEntry("ziti.log"))
239-
zip.writer().write(log)
272+
writer.appendLine("logcat result: ${logrc.get()}")
273+
writer.write(log.get())
274+
writer.appendLine()
275+
writer.appendLine("logcat ERROR:")
276+
writer.appendLine(err.get())
277+
writer.flush()
240278
zip.finish()
241279
zip.flush()
242280
zip.close()

ziti/src/main/kotlin/org/openziti/ZitiContext.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import org.openziti.api.MFAType
2626
import org.openziti.api.Service
2727
import org.openziti.api.ServiceTerminator
2828
import org.openziti.identity.Identity
29+
import java.io.Writer
2930
import java.net.InetSocketAddress
3031
import java.net.Socket
3132
import java.nio.channels.AsynchronousServerSocketChannel
@@ -138,4 +139,6 @@ interface ZitiContext: Identity {
138139

139140
suspend fun getMFARecoveryCodes(code: String, newCodes: Boolean): Array<String>
140141
fun getMFARecoveryCodesAsync(code: String, newCodes: Boolean): CompletionStage<Array<String>>
142+
143+
fun dump(writer: Writer)
141144
}

ziti/src/main/kotlin/org/openziti/impl/ZitiContextImpl.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import org.openziti.net.nio.AsychChannelSocket
3232
import org.openziti.posture.PostureService
3333
import org.openziti.util.Logged
3434
import org.openziti.util.ZitiLog
35+
import java.io.Writer
3536
import java.net.InetAddress
3637
import java.net.InetSocketAddress
3738
import java.net.Socket
@@ -571,4 +572,24 @@ internal class ZitiContextImpl(internal val id: Identity, enabled: Boolean) : Zi
571572

572573
override fun getMFARecoveryCodesAsync(code: String, newCodes: Boolean) =
573574
async { getMFARecoveryCodes(code, newCodes) }.asCompletableFuture()
575+
576+
override fun dump(writer: Writer) {
577+
writer.appendLine("""
578+
id: ${id.name()}
579+
controller: ${id.controller()}
580+
status: ${getStatus()}
581+
""".trimIndent())
582+
583+
writer.appendLine()
584+
writer.appendLine("=== Services ===")
585+
servicesByName.forEach { (name, s) ->
586+
writer.appendLine("name: $name id: ${s.id} permissions: ${s.permissions.joinToString()} intercept: ${s.interceptConfig}")
587+
}
588+
589+
writer.appendLine()
590+
writer.appendLine("=== Channels ===")
591+
channels.forEach { (name, ch) ->
592+
writer.appendLine("ER: $name status: ${ch.state}")
593+
}
594+
}
574595
}

ziti/src/main/kotlin/org/openziti/net/Channel.kt

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,11 @@
1616

1717
package org.openziti.net
1818

19-
import com.codahale.metrics.Meter
20-
import com.codahale.metrics.Timer
21-
import kotlinx.coroutines.*
22-
import kotlinx.coroutines.flow.Flow
23-
import kotlinx.coroutines.flow.collect
24-
import kotlinx.coroutines.flow.flow
25-
import org.openziti.Errors
26-
import org.openziti.ZitiException
19+
import kotlinx.coroutines.Deferred
2720
import org.openziti.api.ApiSession
2821
import org.openziti.identity.Identity
2922
import org.openziti.impl.ChannelImpl
30-
import org.openziti.util.Logged
31-
import org.openziti.util.ZitiLog
3223
import java.io.Closeable
33-
import java.io.EOFException
34-
import java.io.IOException
35-
import java.net.ConnectException
36-
import java.nio.charset.StandardCharsets
37-
import java.time.Duration
38-
import java.time.Instant
39-
import java.util.concurrent.ConcurrentHashMap
40-
import java.util.concurrent.TimeUnit
41-
import java.util.concurrent.atomic.AtomicBoolean
42-
import java.util.concurrent.atomic.AtomicInteger
43-
import kotlin.coroutines.CoroutineContext
44-
import kotlinx.coroutines.channels.Channel as Chan
4524

4625
internal fun Channel(addr: String, id: Identity, apiSession: () -> ApiSession?): Channel {
4726
val ch = ChannelImpl(addr, id, apiSession)

0 commit comments

Comments
 (0)