Skip to content
Commits on Source (51)
stages:
- build
- deploy
variables:
DEPENDENCIES: dbus-daemon diffutils gcc gtk-doc libsecret-devel meson ninja-build openssh openssh-clients python redhat-rpm-config systemd-devel
fedora:Werror:
image: fedora:latest
stage: build
before_script:
- dnf upgrade -y
- dnf install -y 'dnf-command(builddep)' $DEPENDENCIES
- dnf builddep -y gcr
script:
- meson _build -Dwerror=true -Dc_args=-Wno-error=deprecated-declarations
- ninja -C _build
- dbus-run-session -- bash +x ./.gitlab-ci/run-tests.sh
artifacts:
reports:
junit: "_build/${CI_JOB_NAME}-report.xml"
name: "gcr-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
when: always
paths:
- "_build/config.h"
- "_build/meson-logs"
- "_build/${CI_JOB_NAME}-report.xml"
fedora:asan:
image: fedora:latest
stage: build
tags:
- asan # LSAN needs CAP_SYS_PTRACE
before_script:
- dnf upgrade -y
- dnf install -y 'dnf-command(builddep)' $DEPENDENCIES libasan
- dnf builddep -y gcr
script:
- meson _build -Dsanitize=address
- dbus-run-session -- meson test -C _build
artifacts:
name: "gcr-asan-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
when: always
paths:
- "_build/config.h"
- "_build/meson-logs"
fedora:ubsan:
image: fedora:latest
stage: build
before_script:
- dnf upgrade -y
- dnf install -y 'dnf-command(builddep)' $DEPENDENCIES libubsan
- dnf builddep -y gcr
script:
- meson _build -Dsanitize=undefined
- dbus-run-session -- meson test -C _build
artifacts:
name: "gcr-ubsan-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
when: always
paths:
- "_build/config.h"
- "_build/meson-logs"
fedora:coverage:
image: fedora:latest
stage: build
before_script:
- dnf upgrade -y
- dnf install -y 'dnf-command(builddep)' $DEPENDENCIES lcov
- dnf builddep -y gcr
script:
- meson _build -Db_coverage=true
- dbus-run-session -- meson test -C _build
- ninja coverage-html -C _build
coverage: '/^\s+lines.+:\s+([\d.]+\%)\s+/'
artifacts:
name: "gcr-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
paths:
- _build/meson-logs/coveragereport/
artifacts:
name: "gcr-coverage-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
when: always
paths:
- "_build/config.h"
- "_build/meson-logs"
pages:
stage: deploy
only:
- master
needs: ['fedora:coverage']
script:
- mv _build/meson-logs/coveragereport/ public/
artifacts:
when: on_success
paths:
- public
#!/usr/bin/env python3
# Turns a Meson testlog.json file into a JUnit XML report
#
# Copyright 2019 GNOME Foundation
#
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# Original author: Emmanuele Bassi
import argparse
import datetime
import json
import os
import sys
import xml.etree.ElementTree as ET
aparser = argparse.ArgumentParser(description='Turns a Meson test log into a JUnit report')
aparser.add_argument('--project-name', metavar='NAME',
help='The project name',
default='unknown')
aparser.add_argument('--job-id', metavar='ID',
help='The job ID for the report',
default='Unknown')
aparser.add_argument('--branch', metavar='NAME',
help='Branch of the project being tested',
default='master')
aparser.add_argument('--output', metavar='FILE',
help='The output file, stdout by default',
type=argparse.FileType('w', encoding='UTF-8'),
default=sys.stdout)
aparser.add_argument('infile', metavar='FILE',
help='The input testlog.json, stdin by default',
type=argparse.FileType('r', encoding='UTF-8'),
default=sys.stdin)
args = aparser.parse_args()
outfile = args.output
testsuites = ET.Element('testsuites')
testsuites.set('id', '{}/{}'.format(args.job_id, args.branch))
testsuites.set('package', args.project_name)
testsuites.set('timestamp', datetime.datetime.utcnow().isoformat(timespec='minutes'))
suites = {}
for line in args.infile:
data = json.loads(line)
(full_suite, unit_name) = data['name'].split(' / ')
(project_name, suite_name) = full_suite.split(':')
duration = data['duration']
return_code = data['returncode']
log = data['stdout']
unit = {
'suite': suite_name,
'name': unit_name,
'duration': duration,
'returncode': return_code,
'stdout': log,
}
units = suites.setdefault(suite_name, [])
units.append(unit)
for name, units in suites.items():
print('Processing suite {} (units: {})'.format(name, len(units)))
def if_failed(unit):
if unit['returncode'] != 0:
return True
return False
def if_succeded(unit):
if unit['returncode'] == 0:
return True
return False
successes = list(filter(if_succeded, units))
failures = list(filter(if_failed, units))
print(' - {}: {} pass, {} fail'.format(name, len(successes), len(failures)))
testsuite = ET.SubElement(testsuites, 'testsuite')
testsuite.set('name', '{}/{}'.format(args.project_name, name))
testsuite.set('tests', str(len(units)))
testsuite.set('errors', str(len(failures)))
testsuite.set('failures', str(len(failures)))
for unit in successes:
testcase = ET.SubElement(testsuite, 'testcase')
testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
testcase.set('name', unit['name'])
testcase.set('time', str(unit['duration']))
for unit in failures:
testcase = ET.SubElement(testsuite, 'testcase')
testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
testcase.set('name', unit['name'])
testcase.set('time', str(unit['duration']))
failure = ET.SubElement(testcase, 'failure')
failure.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
failure.set('name', unit['name'])
failure.set('type', 'error')
failure.text = unit['stdout']
output = ET.tostring(testsuites, encoding='unicode')
outfile.write(output)
#!/bin/bash
set +e
meson test -C _build
exit_code=$?
python3 .gitlab-ci/meson-junit-report.py \
--project-name=gcr \
--job-id "${CI_JOB_NAME}" \
--output "_build/${CI_JOB_NAME}-report.xml" \
_build/meson-logs/testlog.json
exit $exit_code
gcr 3.41.0:
- Port ssh-agent from gnome-keyring [GNOME/gcr!67]
- build: Fix parallel build failure due to missing marshal dependency [GNOME/gcr!68]
- Fix warnings by dropping `volatile` for g_once_init_inter locations [GNOME/gcr!69]
- tests: More robust against GTask unref race condition [GNOME/gcr!72,GNOME/gcr#84]
- Updated translations
gcr 3.40.0:
- FEATURE: add hkps://keys.openpgp.org to keyserver defaults [GNOME/gcr!62]
- gcr/key-mechanism: Port to GTask [GNOME/gcr!66]
......
......@@ -45,6 +45,13 @@ gcr_docs_ignore_headers = [
'gcr-pkcs11-renderer.h',
'gcr-record.h',
'gcr-single-collection.h',
'gcr-ssh-agent-interaction.h',
'gcr-ssh-agent-preload.h',
'gcr-ssh-agent-private.h',
'gcr-ssh-agent-process.h',
'gcr-ssh-agent-service.h',
'gcr-ssh-agent-util.h',
'gcr-ssh-agent-test.h',
'gcr-unlock-renderer.h',
'gcr-viewer-window.h',
'gcr-xxx.h',
......
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* egg-file-tracker.c - Watch for changes in a directory
Copyright (C) 2008 Stefan Walter
The Gnome Keyring Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The Gnome Keyring Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the Gnome Library; see the file COPYING.LIB. If not,
<http://www.gnu.org/licenses/>.
Author: Stef Walter <stef@memberwebs.com>
*/
#include "config.h"
#include "egg-file-tracker.h"
#include "egg/egg-error.h"
#include <glib.h>
#include <glib/gstdio.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
typedef struct _UpdateDescendants {
EggFileTracker *tracker;
GHashTable *checks;
} UpdateDescendants;
struct _EggFileTracker {
GObject parent;
/* Specification */
GPatternSpec *include;
GPatternSpec *exclude;
gchar *directory_path;
time_t directory_mtime;
/* Matched files */
GHashTable *files;
};
enum {
FILE_ADDED,
FILE_REMOVED,
FILE_CHANGED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
G_DEFINE_TYPE (EggFileTracker, egg_file_tracker, G_TYPE_OBJECT);
/* -----------------------------------------------------------------------------
* HELPERS
*/
static void
copy_key_string (gpointer key, gpointer value, gpointer data)
{
GHashTable *dest = (GHashTable*)data;
g_hash_table_replace (dest, g_strdup (key), value);
}
static void
remove_files (gpointer key, gpointer value, gpointer data)
{
EggFileTracker *self = EGG_FILE_TRACKER (data);
g_hash_table_remove (self->files, key);
g_signal_emit (self, signals[FILE_REMOVED], 0, key);
}
static gboolean
update_file (EggFileTracker *self, gboolean force_all, const gchar *path)
{
time_t old_mtime;
struct stat sb;
if (stat (path, &sb) < 0) {
if (errno != ENOENT && errno != ENOTDIR && errno != EPERM)
g_warning ("couldn't stat file: %s: %s", path, g_strerror (errno));
return FALSE;
}
old_mtime = GPOINTER_TO_UINT (g_hash_table_lookup (self->files, path));
g_assert (old_mtime);
/* See if it has actually changed */
if (force_all || old_mtime != sb.st_mtime) {
g_assert (g_hash_table_lookup (self->files, path));
g_hash_table_insert (self->files, g_strdup (path), GUINT_TO_POINTER (sb.st_mtime));
g_signal_emit (self, signals[FILE_CHANGED], 0, path);
}
return TRUE;
}
static void
update_each_file (gpointer key, gpointer unused, gpointer data)
{
UpdateDescendants *ctx = (UpdateDescendants*)data;
if (update_file (ctx->tracker, FALSE, key))
g_hash_table_remove (ctx->checks, key);
}
static void
update_directory (EggFileTracker *self, gboolean force_all, GHashTable *checks)
{
UpdateDescendants uctx;
struct stat sb;
GError *err = NULL;
const char *filename;
gchar *file;
GDir *dir;
int ret, lasterr;
g_assert (checks);
g_assert (EGG_IS_FILE_TRACKER (self));
if (!self->directory_path)
return;
if (stat (self->directory_path, &sb) < 0) {
if (errno != ENOENT && errno != ENOTDIR && errno != EPERM)
g_message ("couldn't stat directory: %s: %s",
self->directory_path, g_strerror (errno));
return;
}
/* See if it was updated since last seen or not */
if (!force_all && self->directory_mtime == sb.st_mtime) {
uctx.checks = checks;
uctx.tracker = self;
/* Still need to check for individual file updates */
g_hash_table_foreach (self->files, update_each_file, &uctx);
return;
}
self->directory_mtime = sb.st_mtime;
/* Actually list the directory */
dir = g_dir_open (self->directory_path, 0, &err);
if (dir == NULL) {
if (errno != ENOENT && errno != ENOTDIR && errno != EPERM)
g_message ("couldn't list keyrings at: %s: %s", self->directory_path,
egg_error_message (err));
g_error_free (err);
return;
}
while ((filename = g_dir_read_name (dir)) != NULL) {
if (filename[0] == '.')
continue;
if (self->include && !g_pattern_match_string (self->include, filename))
continue;
if (self->exclude && g_pattern_match_string (self->exclude, filename))
continue;
file = g_build_filename (self->directory_path, filename, NULL);
/* If we hadn't yet seen this, then add it */
if (!g_hash_table_remove (checks, file)) {
/* Get the last modified time for this one */
ret = g_stat (file, &sb);
lasterr = errno;
/* Couldn't access the file */
if (ret < 0) {
g_message ("couldn't stat file: %s: %s", file, g_strerror (lasterr));
} else {
/* We don't do directories */
if (!(sb.st_mode & S_IFDIR)) {
g_hash_table_replace (self->files, g_strdup (file), GINT_TO_POINTER (sb.st_mtime));
g_signal_emit (self, signals[FILE_ADDED], 0, file);
}
}
/* Otherwise we already had it, see if it needs updating */
} else {
update_file (self, force_all, file);
}
g_free (file);
}
g_dir_close (dir);
}
/* -----------------------------------------------------------------------------
* OBJECT
*/
static void
egg_file_tracker_init (EggFileTracker *self)
{
self->files = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
}
static void
egg_file_tracker_finalize (GObject *obj)
{
EggFileTracker *self = EGG_FILE_TRACKER (obj);
if (self->include)
g_pattern_spec_free (self->include);
if (self->exclude)
g_pattern_spec_free (self->exclude);
g_free (self->directory_path);
g_hash_table_destroy (self->files);
G_OBJECT_CLASS (egg_file_tracker_parent_class)->finalize (obj);
}
static void
egg_file_tracker_class_init (EggFileTrackerClass *klass)
{
GObjectClass *gobject_class;
gobject_class = (GObjectClass*) klass;
egg_file_tracker_parent_class = g_type_class_peek_parent (klass);
gobject_class->finalize = egg_file_tracker_finalize;
signals[FILE_ADDED] = g_signal_new ("file-added", EGG_TYPE_FILE_TRACKER,
G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (EggFileTrackerClass, file_added),
NULL, NULL, g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 1, G_TYPE_STRING);
signals[FILE_CHANGED] = g_signal_new ("file-changed", EGG_TYPE_FILE_TRACKER,
G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (EggFileTrackerClass, file_changed),
NULL, NULL, g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 1, G_TYPE_STRING);
signals[FILE_REMOVED] = g_signal_new ("file-removed", EGG_TYPE_FILE_TRACKER,
G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (EggFileTrackerClass, file_removed),
NULL, NULL, g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 1, G_TYPE_STRING);
}
EggFileTracker*
egg_file_tracker_new (const gchar *directory, const gchar *include, const gchar *exclude)
{
EggFileTracker *self;
const gchar *homedir;
g_return_val_if_fail (directory, NULL);
self = g_object_new (EGG_TYPE_FILE_TRACKER, NULL);
/* TODO: Use properties */
if (directory[0] == '~' && directory[1] == '/') {
homedir = g_getenv ("HOME");
if (!homedir)
homedir = g_get_home_dir ();
self->directory_path = g_build_filename (homedir, directory + 2, NULL);
/* A relative or absolute path */
} else {
self->directory_path = g_strdup (directory);
}
self->include = include ? g_pattern_spec_new (include) : NULL;
self->exclude = exclude ? g_pattern_spec_new (exclude) : NULL;
return self;
}
void
egg_file_tracker_refresh (EggFileTracker *self, gboolean force_all)
{
GHashTable *checks;
g_return_if_fail (EGG_IS_FILE_TRACKER (self));
/* Copy into our check set */
checks = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
g_hash_table_foreach (self->files, copy_key_string, checks);
/* If only one volume, then just try and access it directly */
update_directory (self, force_all, checks);
/* Find any keyrings whose paths we didn't see */
g_hash_table_foreach (checks, remove_files, self);
g_hash_table_destroy (checks);
}
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* egg-file-tracker.h - Watch for changes in a directory
Copyright (C) 2008, Stefan Walter
The Gnome Keyring Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The Gnome Keyring Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the Gnome Library; see the file COPYING.LIB. If not,
<http://www.gnu.org/licenses/>.
Author: Stef Walter <stef@memberwebs.com>
*/
#ifndef __EGG_FILE_TRACKER_H__
#define __EGG_FILE_TRACKER_H__
#include <glib-object.h>
G_BEGIN_DECLS
#define EGG_TYPE_FILE_TRACKER (egg_file_tracker_get_type ())
#define EGG_FILE_TRACKER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_FILE_TRACKER, EggFileTracker))
#define EGG_FILE_TRACKER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_FILE_TRACKER, GObject))
#define EGG_IS_FILE_TRACKER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_FILE_TRACKER))
#define EGG_IS_FILE_TRACKER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_FILE_TRACKER))
#define EGG_FILE_TRACKER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_FILE_TRACKER, EggFileTrackerClass))
typedef struct _EggFileTracker EggFileTracker;
typedef struct _EggFileTrackerClass EggFileTrackerClass;
struct _EggFileTrackerClass {
GObjectClass parent_class;
void (*file_added) (EggFileTracker *locmgr, const gchar *path);
void (*file_changed) (EggFileTracker *locmgr, const gchar *path);
void (*file_removed) (EggFileTracker *locmgr, const gchar *path);
};
GType egg_file_tracker_get_type (void) G_GNUC_CONST;
EggFileTracker* egg_file_tracker_new (const gchar *directory,
const gchar *include_pattern,
const gchar *exclude_pattern);
void egg_file_tracker_refresh (EggFileTracker *self,
gboolean force_all);
G_END_DECLS
#endif /* __EGG_FILE_TRACKER_H__ */
......@@ -59,7 +59,7 @@ GCRY_THREAD_OPTION_PTHREAD_IMPL;
void
egg_libgcrypt_initialize (void)
{
static volatile gsize gcrypt_initialized = 0;
static size_t gcrypt_initialized = 0;
unsigned seed;
if (g_once_init_enter (&gcrypt_initialized)) {
......
......@@ -142,7 +142,7 @@ static OidInfo oid_info[] = {
static OidInfo*
find_oid_info (GQuark oid)
{
static volatile gsize inited_oids = 0;
static size_t inited_oids = 0;
int i;
g_return_val_if_fail (oid != 0, NULL);
......
......@@ -56,7 +56,7 @@ static GQuark OID_SHA1;
static void
init_quarks (void)
{
static volatile gsize quarks_inited = 0;
static size_t quarks_inited = 0;
if (g_once_init_enter (&quarks_inited)) {
......
......@@ -332,3 +332,71 @@ egg_tests_run_with_loop (void)
return ret;
}
void
egg_tests_copy_scratch_file (const gchar *directory,
const gchar *filename)
{
GError *error = NULL;
gchar *basename;
gchar *contents;
gchar *destination;
gsize length;
g_assert (directory);
g_file_get_contents (filename, &contents, &length, &error);
g_assert_no_error (error);
basename = g_path_get_basename (filename);
destination = g_build_filename (directory, basename, NULL);
g_free (basename);
g_file_set_contents (destination, contents, length, &error);
g_assert_no_error (error);
g_free (destination);
g_free (contents);
}
gchar *
egg_tests_create_scratch_directory (const gchar *file_to_copy,
...)
{
gchar *basename;
gchar *directory;
va_list va;
basename = g_path_get_basename (g_get_prgname ());
directory = g_strdup_printf ("/tmp/scratch-%s.XXXXXX", basename);
g_free (basename);
if (!g_mkdtemp (directory))
g_assert_not_reached ();
va_start (va, file_to_copy);
while (file_to_copy != NULL) {
egg_tests_copy_scratch_file (directory, file_to_copy);
file_to_copy = va_arg (va, const gchar *);
}
va_end (va);
return directory;
}
void
egg_tests_remove_scratch_directory (const gchar *directory)
{
gchar *argv[] = { "rm", "-rf", (gchar *)directory, NULL };
GError *error = NULL;
gint rm_status;
g_assert_cmpstr (directory, !=, "");
g_assert_cmpstr (directory, !=, "/");
g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL,
NULL, NULL, NULL, &rm_status, &error);
g_assert_no_error (error);
g_assert_cmpint (rm_status, ==, 0);
}
......@@ -74,4 +74,12 @@ gint egg_tests_run_with_loop (void);
} \
G_STMT_END
void egg_tests_copy_scratch_file (const gchar *directory,
const gchar *file_to_copy);
gchar * egg_tests_create_scratch_directory (const gchar *file_to_copy,
...) G_GNUC_NULL_TERMINATED;
void egg_tests_remove_scratch_directory (const gchar *directory);
#endif /* EGG_DH_H_ */
......@@ -6,6 +6,7 @@ libegg_sources = [
'egg-dh.c',
'egg-dn.c',
'egg-decimal.c',
'egg-file-tracker.c',
'egg-hex.c',
'egg-hkdf.c',
'egg-libgcrypt.c',
......
......@@ -139,7 +139,7 @@ GQuark
gck_error_get_quark (void)
{
static GQuark domain = 0;
static volatile gsize quark_inited = 0;
static size_t quark_inited = 0;
if (g_once_init_enter (&quark_inited)) {
domain = g_quark_from_static_string ("gck-error");
......
......@@ -66,7 +66,7 @@ G_DEFINE_INTERFACE (GckObjectCache, gck_object_cache, GCK_TYPE_OBJECT);
static void
gck_object_cache_default_init (GckObjectCacheIface *iface)
{
static volatile gsize initialized = 0;
static size_t initialized = 0;
if (g_once_init_enter (&initialized)) {
/**
......
......@@ -155,7 +155,7 @@ GQuark
gck_uri_error_get_quark (void)
{
static GQuark domain = 0;
static volatile gsize quark_inited = 0;
static size_t quark_inited = 0;
if (g_once_init_enter (&quark_inited)) {
domain = g_quark_from_static_string ("gck-uri-error");
......
-----BEGIN DSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,1ED7C6189634877B
lex6pFMAspyvnqSktXA1NX/x80/Ebb9BGFaIcJAPvLduCrDR02fgwc3oE+dwSwwe
PXZ8vJK8+AP+Z8Rkedya/3OT4vaAuSENZFCfJA+P6lXglVQplA57R4U5/P9580Ee
l/VTumnh5Gz84hJ5TuEspDOLrq8atkc31qFbEJ+zjMLygGNGbIOzecLou2pBt1Ol
ncx1MPIznoJl2b1NQt7rgPpcbqzCHo+/qgLgvGs7osIg8xzzp+E2ifWuwCnY4NmW
dxLRABi4I97q7kShH7OblBQLKxDreg28sojJQ0h0y0fd6xVcoscFCvfanFh8xx/D
rI+JV3HCRCrlB9YS6U3zB5vpbc1UQ1EaE4AxSmrSLdKsvrPGc7M+grwy/DjYerqO
WGwFWnz/OrlXruJG9Nwyltq/YmXAxFGoSWrunkm42xUxYs8RElddQOFC0ZyfVWOi
IOS2Bv2HkNW+lMTRoR/RIbDc90wzO0HL0Xx4v6LYSbVBZIcaOJU+stoNLeE8Fu53
G47YU+Fd7WswdlIdXtrPjyyiWapf6+xNdhRrqB+40JJQRi2mL1NyYZ2bZkjEd0Or
DsfFH/+DlZrjEdlqWTK2ow==
-----END DSA PRIVATE KEY-----
ssh-dss AAAAB3NzaC1kc3MAAACBANHNmw2YHEodUj4Ae27i8Rm8uoLnpS68QEiCJx8bv9P1o0AaD0w55sH+TBzlo7vtAEDlAzIOBY3PMpy5WarELTIeXmFPzKfHL8tuxMbOPaN/wDkDZNnJZsqlyRwlQKStPcAlvLBNuMjA53u2ndMTVghtUHXETQzwxKhXf7TmvfLBAAAAFQDnF/Y8MgFCP0PpRC5ZAQo1dyDEwwAAAIEAr4iOpTeZx8i1QgQpRl+dmbBAtHTXbPiophzNJBge9lixqF0T3egN2B9wGGnumIXmnst9RPPjuu+cHCLfxhXHzLlW8MLwoiF6ZQOx9M8WcfWIl5oiGyr2e969woRf5OcMGQPOQBdws6MEtemRqq5gu6dqDqVl3xfhSZSP9LpqAI8AAACAUjiuQ3qGErsCz++qd0qrR++QA185XGXAPZqQEHcr4iKSlO17hSUYA03kOWtDaeRtJOlxjIjl9iLo3juKGFgxUfo2StScOSO2saTWFGjA4MybHCK1+mIYXRcYrq314yK2Tmbql/UGDWpcCCGXLWpSFHTaXTbJjPd6VL+TO9/8tFk=
-----BEGIN DSA PRIVATE KEY-----
MIIBuwIBAAKBgQDCyZij6148cb6Gp2XazVJr+zrcfSkbN1MyeR5hCgACTqcn1D4R
huf79uWe7lvyYuPyXNedfde0iFP7Ff9k1T9i3thyYjs1scdwpbqxnAVnmN4SNv/v
fFXPp6w0EDNqmAOwg+Pqwue7juiPVJyPBcsSPZZKTOMDCS/2fVibFCXgswIVAOW6
ngNCg6d4Cn+GHQtEbNVtZpRdAoGAP2LhEH+zUCYri0xi32l9bMnlqDCBdw2zOMbe
G2XDRt40W4ObiE1+PPNp/CDFuYrOjD4s7Cl4s/U+iop4DKsPcLwbdr3CoWE6hEuO
dH0jkzcvt8kZ5Ymtm3OiqEW2ARi8rUwVJ9+bRbkfRerNrDeH/PQzwCWf7Lzp9lPT
NVjCDtsCgYANW+HtuJWVmfXRRDJ1goMK+GXixDvBLBbFSDf74kYInt3vUBm4MKpr
HbmC27TLRymb6IOH1ENpYT3MffZJusQTqqZJKPba5nwLvPP9lzN60bJAtqiWUsqf
wHEh6Jx+qoMggm8i6ogJJO2zDlki5Twf1ilN+tinHdOL/2CmPPRMgAIVALKfUS61
xqFTOY5fG1+rLwlPGvL9
-----END DSA PRIVATE KEY-----
ssh-dss AAAAB3NzaC1kc3MAAACBAMLJmKPrXjxxvoanZdrNUmv7Otx9KRs3UzJ5HmEKAAJOpyfUPhGG5/v25Z7uW/Ji4/Jc151917SIU/sV/2TVP2Le2HJiOzWxx3ClurGcBWeY3hI2/+98Vc+nrDQQM2qYA7CD4+rC57uO6I9UnI8FyxI9lkpM4wMJL/Z9WJsUJeCzAAAAFQDlup4DQoOneAp/hh0LRGzVbWaUXQAAAIA/YuEQf7NQJiuLTGLfaX1syeWoMIF3DbM4xt4bZcNG3jRbg5uITX4882n8IMW5is6MPizsKXiz9T6KingMqw9wvBt2vcKhYTqES450fSOTNy+3yRnlia2bc6KoRbYBGLytTBUn35tFuR9F6s2sN4f89DPAJZ/svOn2U9M1WMIO2wAAAIANW+HtuJWVmfXRRDJ1goMK+GXixDvBLBbFSDf74kYInt3vUBm4MKprHbmC27TLRymb6IOH1ENpYT3MffZJusQTqqZJKPba5nwLvPP9lzN60bJAtqiWUsqfwHEh6Jx+qoMggm8i6ogJJO2zDlki5Twf1ilN+tinHdOL/2CmPPRMgA==