<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kishan B</title>
    <description>The latest articles on DEV Community by Kishan B (@kishanbsh).</description>
    <link>https://dev.to/kishanbsh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F216400%2F1f57f516-ef9b-42f8-ba50-63633602c1f3.jpeg</url>
      <title>DEV Community: Kishan B</title>
      <link>https://dev.to/kishanbsh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kishanbsh"/>
    <language>en</language>
    <item>
      <title>Checking out code using github action in legacy runner</title>
      <dc:creator>Kishan B</dc:creator>
      <pubDate>Sun, 18 Aug 2024 07:53:35 +0000</pubDate>
      <link>https://dev.to/kishanbsh/checking-out-code-using-github-action-in-legacy-runner-4a6d</link>
      <guid>https://dev.to/kishanbsh/checking-out-code-using-github-action-in-legacy-runner-4a6d</guid>
      <description>&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;Performing a simple git checkout using official &lt;a href="https://github.com/actions/checkout" rel="noopener noreferrer"&gt;checkout&lt;/a&gt; action fails in a legacy self hosted runner running amazon linux 2 because newer versions of nodejs(&amp;gt;= 20) requires a newer version of GLIBC which is not available in these operating systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;Use bash to perform the checkout in the action code i.e&lt;/p&gt;

&lt;p&gt;replace the line&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;git clone --depth 1 -b "${GITHUB_HEAD_REF:-$GITHUB_REF_NAME}" "https://github.com/${GITHUB_REPOSITORY}.git" .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Note
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--depth 1&lt;/code&gt; performs a shallow-clone there by increasing your performance as we don't need to pull the entire commit history for every pipeline run.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;${GITHUB_HEAD_REF:-$GITHUB_REF_NAME}&lt;/code&gt; doing this to ensure we always get the name of the branch which triggered the pipelines. This way of doing it makes it trigger agnostic i.e. both push and pull request trigger will work as intended.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.&lt;/code&gt; The dot at the end ensures that the checkout happens in the current directory which is the workspace.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>githubactions</category>
      <category>selfhosted</category>
      <category>amazonlinux</category>
    </item>
    <item>
      <title>How to use tfenv to install older versions of terraform in m1 mac?</title>
      <dc:creator>Kishan B</dc:creator>
      <pubDate>Tue, 12 Sep 2023 04:44:48 +0000</pubDate>
      <link>https://dev.to/kishanbsh/how-to-use-tfenv-to-install-older-versions-of-terraform-in-m1-mac-e92</link>
      <guid>https://dev.to/kishanbsh/how-to-use-tfenv-to-install-older-versions-of-terraform-in-m1-mac-e92</guid>
      <description>&lt;p&gt;To do that assign "TFENV_ARCH" environment variable with value "amd64" like below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TFENV_ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;amd64 tfenv &lt;span class="nb"&gt;install &lt;/span&gt;0.12.31
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>terraform</category>
      <category>m1mac</category>
      <category>shorts</category>
    </item>
    <item>
      <title>How to get the DDL dump of a redshift database</title>
      <dc:creator>Kishan B</dc:creator>
      <pubDate>Thu, 12 Jan 2023 05:38:09 +0000</pubDate>
      <link>https://dev.to/kishanbsh/how-to-get-the-ddl-dump-of-a-redshift-database-2bkb</link>
      <guid>https://dev.to/kishanbsh/how-to-get-the-ddl-dump-of-a-redshift-database-2bkb</guid>
      <description>&lt;p&gt;When I was googling "How to get the DDL dump of a redshift database" I found &lt;a href="https://awsbytes.com/how-to-get-the-ddl-of-a-table-in-redshift-database/" rel="noopener noreferrer"&gt;this blog&lt;/a&gt; which proposed a way do it but the con of the approach proposed there is it requires us create new objects in redshift just to extract DDL which was not acceptable for me, so I tried and found a better way which is given below&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach
&lt;/h2&gt;

&lt;p&gt;The approach below makes use of the following commands from redshift and wraps them in a bash script which makes use of the redshift data api&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/redshift/latest/dg/r_SHOW_TABLE.html" rel="noopener noreferrer"&gt;SHOW TABLE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/redshift/latest/dg/r_SHOW_VIEW.html" rel="noopener noreferrer"&gt;SHOW VIEW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/redshift/latest/dg/r_SHOW_EXTERNAL_TABLE.html" rel="noopener noreferrer"&gt;SHOW_EXTERNAL_TABLE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ensure &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html" rel="noopener noreferrer"&gt;awscli&lt;/a&gt; and &lt;a href="https://stedolan.github.io/jq/tutorial/" rel="noopener noreferrer"&gt;jq&lt;/a&gt; command are installed.&lt;/li&gt;
&lt;li&gt;Create a script named &lt;code&gt;dumpddl.sh&lt;/code&gt; with the following contents and give it executable permissions using command &lt;code&gt;chmod +x ./dumpddl.sh&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nv"&gt;CLUSTER_IDENTIFIER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;&amp;lt;your cluster identifier - required only for managed redshift&amp;gt;&amp;gt;"&lt;/span&gt;
&lt;span class="nv"&gt;WORKGROUP_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;&amp;lt;workgroup name - required only for serverless&amp;gt;&amp;gt;"&lt;/span&gt;
&lt;span class="nv"&gt;DATABASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;&amp;lt;your database&amp;gt;&amp;gt;"&lt;/span&gt;
&lt;span class="nv"&gt;DATABASE_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;&amp;lt;your database user&amp;gt;&amp;gt;"&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;query_result&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nv"&gt;query_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;aws redshift-data execute-statement &lt;span class="nt"&gt;--with-event&lt;/span&gt; &lt;span class="nt"&gt;--db-user&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DATABASE_USER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--cluster-identifier&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CLUSTER_IDENTIFIER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--workgroup-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKGROUP_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--database&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DATABASE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--sql&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;query&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;".Id"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;sleep &lt;/span&gt;2
  aws redshift-data get-statement-result &lt;span class="nt"&gt;--id&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;query_id&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;".Records[][0].stringValue"&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Replace the below names of tables, views and external tables with the ones you want to take ddl dump on&lt;/span&gt;
query_result &lt;span class="s2"&gt;"SHOW TABLE person"&lt;/span&gt;
query_result &lt;span class="s2"&gt;"SHOW VIEW org_view"&lt;/span&gt;
query_result &lt;span class="s2"&gt;"SHOW EXTERNAL TABLE &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;org_schema&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;.employee_details"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Run following command to get the ddl dump
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./dumpddl.sh &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ddl_dump.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pros
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No need to install anything inside the redshift cluster.&lt;/li&gt;
&lt;li&gt;Works from the local machine even if redshift cluster is within a VPC(through redshift data API).&lt;/li&gt;
&lt;li&gt;Works for both managed redshift and serverless redshift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cons
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Requires us to know the list of tables and views for which we want the ddl dump.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Used TDD approach for a Hello World rust cli app</title>
      <dc:creator>Kishan B</dc:creator>
      <pubDate>Sun, 26 Jun 2022 14:10:33 +0000</pubDate>
      <link>https://dev.to/kishanbsh/used-tdd-approach-for-a-hello-world-rust-cli-app-1b18</link>
      <guid>https://dev.to/kishanbsh/used-tdd-approach-for-a-hello-world-rust-cli-app-1b18</guid>
      <description>&lt;p&gt;For the first time ever in my life i wrote hello world application using &lt;a href="https://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD (Test driven development)&lt;/a&gt;. Don't get me wrong here, i have practiced TDD before for larger applications but never have i done it for an hello world app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;Write an CLI application that prints out "Hello TDD world!" in STDOUT.&lt;/p&gt;

&lt;h2&gt;
  
  
  How did i do it?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I created a project using &lt;code&gt;cargo new hello-world-tdd&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;I added a dependency &lt;code&gt;assert_cmd&lt;/code&gt; which lets us test out outputs of any binary program&lt;/li&gt;
&lt;li&gt;Created a file &lt;code&gt;tests/cli.rs&lt;/code&gt;  and I wrote the following test
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;assert_cmd&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;test_cli_app_should_print_hello_tdd_world&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;cargo_bin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello-world-tdd"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="nf"&gt;.assert&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.success&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.stdout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello TDD world!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Run the test using command &lt;code&gt;cargo test&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The above test will fail saying the following, this happens because the cargo new had generated a &lt;code&gt;src/main.rs&lt;/code&gt; file which printed out "Hello world!"
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;running 1 test
test test_cli_app_should_print_hello_tdd_world ... FAILED

failures:

---- test_cli_app_should_print_hello_tdd_world stdout ----
thread 'test_cli_app_should_print_hello_tdd_world' panicked at 'Unexpected stdout, failed diff original var
├── original: Hello TDD world!
├── diff:
│   ---   orig
│   +++   var
│   @@ -1 +1 @@
│   -Hello TDD world!
│   +Hello world!
└── var as str: Hello world!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Now that we have a failing test(RED), the next job is to make it green by modifying the contents of the println statement.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;cargo test&lt;/code&gt; again, The test now passes (Green)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code for this is available at &lt;a href="https://github.com/kishaningithub/hello-world-tdd"&gt;https://github.com/kishaningithub/hello-world-tdd&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learning.oreilly.com/library/view/command-line-rust/9781098109424/preface01.html#idm45828825384320"&gt;Command line rust OReilly book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>rust</category>
      <category>tdd</category>
    </item>
    <item>
      <title>Use ZAP to Perform DAST (Dynamic Application Security Testing)</title>
      <dc:creator>Kishan B</dc:creator>
      <pubDate>Wed, 16 Feb 2022 09:18:57 +0000</pubDate>
      <link>https://dev.to/kishanbsh/use-zap-to-perform-dast-dynamic-application-security-testing-5a43</link>
      <guid>https://dev.to/kishanbsh/use-zap-to-perform-dast-dynamic-application-security-testing-5a43</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
Introduction

&lt;ul&gt;
&lt;li&gt;What is Dynamic Application Security Testing (DAST)&lt;/li&gt;
&lt;li&gt;What is ZAP&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
How to use ZAP

&lt;ul&gt;
&lt;li&gt;ZAP Scan for API&lt;/li&gt;
&lt;li&gt;
Local Run

&lt;ul&gt;
&lt;li&gt;Example - for API with Swagger&lt;/li&gt;
&lt;li&gt;For SOAP/GraphQL&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
CircleCI Integrate

&lt;ul&gt;
&lt;li&gt;Example - for API with Swagger&lt;/li&gt;
&lt;li&gt;For SOAP/GraphQL&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
ZAP Scan for Application (with UI)

&lt;ul&gt;
&lt;li&gt;Local Run for UI app&lt;/li&gt;
&lt;li&gt;CircleCI Integration for UI app&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is Dynamic Application Security Testing (DAST)
&lt;/h3&gt;

&lt;p&gt;Dynamic application security testing (DAST) is a process of testing an application or software product in an operating state. This kind of testing is helpful for industry-standard compliance and general security protections for evolving projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is ZAP
&lt;/h3&gt;

&lt;p&gt;Zed Attack Proxy (ZAP) is a free, open-source penetration testing tool being maintained under the umbrella of the Open Web Application Security Project (OWASP). ZAP is designed specifically for testing web applications and is both flexible and extensible.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use ZAP
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ZAP Scan for API
&lt;/h3&gt;

&lt;p&gt;You can use &lt;a href="https://www.zaproxy.org/docs/docker/api-scan/"&gt;zap-api-scan&lt;/a&gt; to perform scans against APIs defined by OpenAPI, SOAP, or GraphQL. If your API is protected with authentication, you will need to prepare a token or API key before running the script.&lt;/p&gt;

&lt;h4&gt;
  
  
  Local Run
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Example - for API with Swagger
&lt;/h5&gt;

&lt;p&gt;The following example shows how to run ZAP locally against an API with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;url: &lt;a href="http://192.168.1.10"&gt;http://192.168.1.10&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;the swagger doc url:  &lt;a href="http://192.168.1.10/swagger.json"&gt;http://192.168.1.10/swagger.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Authentication header name: Authorization&lt;/li&gt;
&lt;li&gt;Authentication header value: api_token_value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Put your token or API key used for authentication into a configuration file or environment parameters, the following is a configuration file example.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ZAP_AUTH_HEADER_VALUE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;api_token_value
&lt;span class="nv"&gt;ZAP_AUTH_HEADER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Authorization
&lt;span class="nv"&gt;ZAP_AUTH_HEADER_SITE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.1.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: the ZAP_AUTH_HEADER_SITE value should exclude the http/https protocol and port, e.g. for the target &lt;a href="https://www.this-is-a-target.com:8080"&gt;https://www.this-is-a-target.com:8080&lt;/a&gt;, the ZAP_AUTH_HEADER_SITE value should be &lt;a href="http://www.this-is-a-target.com"&gt;www.this-is-a-target.com&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the following command to pull the zap docker image
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull owasp/zap2docker-stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Run the following command to trigger zap-api-scan for an API with swagger doc (please replace the values in color when you use it for your API):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--env-file&lt;/span&gt; configuration_file_name &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nv"&gt;$PWD&lt;/span&gt;:/zap/wrk owasp/zap2docker-stable:latest zap-api-scan.py &lt;span class="nt"&gt;-t&lt;/span&gt; http://192.168.1.10/swagger.json &lt;span class="nt"&gt;-f&lt;/span&gt; openapi &lt;span class="nt"&gt;-r&lt;/span&gt; report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;After executing the above commands, a report.html should be generated in your current directory, it contains the test results.&lt;/li&gt;
&lt;/ol&gt;

&lt;h5&gt;
  
  
  For SOAP/GraphQL
&lt;/h5&gt;

&lt;ol&gt;
&lt;li&gt;To run ZAP Scan against SOAP/GraphQL is very similar to the way to run it against Swagger API, the only difference is you need to change the "-f" option in the step 3 command to the following.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For SOAP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--env-file&lt;/span&gt; configuration_file_name &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nv"&gt;$PWD&lt;/span&gt;:/zap/wrk owasp/zap2docker-stable:latest zap-api-scan.py &lt;span class="nt"&gt;-t&lt;/span&gt; http://192.168.1.10/soap_wsdl_url &lt;span class="nt"&gt;-f&lt;/span&gt; soap &lt;span class="nt"&gt;-r&lt;/span&gt; report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For GraphQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--env-file&lt;/span&gt; configuration_file_name &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nv"&gt;$PWD&lt;/span&gt;:/zap/wrk owasp/zap2docker-stable:latest zap-api-scan.py &lt;span class="nt"&gt;-t&lt;/span&gt; http://192.168.1.10/graphql_url &lt;span class="nt"&gt;-f&lt;/span&gt; graphql &lt;span class="nt"&gt;-r&lt;/span&gt; report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  CircleCI Integrate
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Example - for API with Swagger
&lt;/h5&gt;

&lt;p&gt;The following example shows how to integrate ZAP into CircleCI to scan the API with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;url: &lt;a href="http://192.168.1.10"&gt;http://192.168.1.10&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;the swagger doc url:  &lt;a href="http://192.168.1.10/swagger.json"&gt;http://192.168.1.10/swagger.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Authentication header name: Authorization&lt;/li&gt;
&lt;li&gt;Authentication header value: api_token_value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add the following Environment Variables into your project env in the CircleCI
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ZAP_AUTH_HEADER_VALUE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;api_token_value
&lt;span class="nv"&gt;ZAP_AUTH_HEADER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Authorization
&lt;span class="nv"&gt;ZAP_AUTH_HEADER_SITE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;target_url
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: the ZAP_AUTH_HEADER_SITE value should exclude the http/https protocol and port, e.g. for the target &lt;a href="https://www.this-is-a-target.com:8080"&gt;https://www.this-is-a-target.com:8080&lt;/a&gt;, the ZAP_AUTH_HEADER_SITE value should be &lt;a href="http://www.this-is-a-target.com"&gt;www.this-is-a-target.com&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add the following content in .circleci/config.yml:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owasp/zap2docker-stable&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
              &lt;span class="s"&gt;mkdir /zap/wrk&lt;/span&gt;
              &lt;span class="s"&gt;zap-api-scan.py -f openapi -t https://target-url/swagger.json -r report.html&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;store_artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/zap/wrk&lt;/span&gt;
          &lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zap-report&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;After executing the above commands, a zap-report/report.html should be generated in the pipeline artifacts, it contains the test results.&lt;/li&gt;
&lt;/ol&gt;

&lt;h5&gt;
  
  
  For SOAP/GraphQL
&lt;/h5&gt;

&lt;p&gt;To integrate ZAP Scan into CI/CD to scan the SOAP/GraphQL API is very similar to the way to run it against Swagger API, the only difference is you need to change the "-f" option in the step 2 .circleci/config.yml file.&lt;/p&gt;

&lt;p&gt;For SOAP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owasp/zap2docker-stable&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
              &lt;span class="s"&gt;mkdir /zap/wrk&lt;/span&gt;
              &lt;span class="s"&gt;zap-api-scan.py -f soap  -t https://target-url/soap_wsdl_url -r report.html&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;store_artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/zap/wrk&lt;/span&gt;
          &lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zap-report&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For GraphQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owasp/zap2docker-stable&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
              &lt;span class="s"&gt;mkdir /zap/wrk&lt;/span&gt;
              &lt;span class="s"&gt;zap-api-scan.py -f graphql -t https://target-url/graphql_url -r report.html&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;store_artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/zap/wrk&lt;/span&gt;
          &lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zap-report&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ZAP Scan for Application (with UI)
&lt;/h3&gt;

&lt;p&gt;You can use &lt;a href="https://www.zaproxy.org/docs/docker/full-scan/"&gt;zap-full-scan&lt;/a&gt; to perform a full active scan for a web application. If your application is protected with authentication, you will need to prepare an authorization header or cookie before running the script.&lt;/p&gt;

&lt;h4&gt;
  
  
  Local Run for UI app
&lt;/h4&gt;

&lt;p&gt;The following example shows how to run ZAP locally against an application with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;url: &lt;a href="http://192.168.1.10"&gt;http://192.168.1.10&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Authentication header name: Authorization&lt;/li&gt;
&lt;li&gt;Authentication header value: authrozation_token_here&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: Please change the header name to "Cookie" if your application is authenticated by cookie/session.&lt;/p&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Put your token or API key used for authentication into a configuration file or environment parameters, the following is a configuration file example.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZAP_AUTH_HEADER_VALUE=authrozation_token_here
ZAP_AUTH_HEADER=Authorization
ZAP_AUTH_HEADER_SITE=192.168.1.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: the ZAP_AUTH_HEADER_SITE value should exclude the http/https protocol and port, e.g. for the target &lt;a href="https://www.this-is-a-target.com:8080"&gt;https://www.this-is-a-target.com:8080&lt;/a&gt;, the ZAP_AUTH_HEADER_SITE value should be &lt;a href="http://www.this-is-a-target.com"&gt;www.this-is-a-target.com&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the following command to pull the zap docker image
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker pull owasp/zap2docker-stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Run the following command to trigger &lt;a href="https://www.zaproxy.org/docs/docker/full-scan/"&gt;zap-full-scan&lt;/a&gt; (please replace the values in color when you use it for your application):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -it --env-file configuration_file_name --rm -v $PWD:/zap/wrk owasp/zap2docker-stable:latest zap-full-scan.py -t http://192.168.1.10 -r report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;After executing the above commands, a report.html should be generated in your current directory, it contains the test results.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  CircleCI Integration for UI app
&lt;/h4&gt;

&lt;p&gt;The following example shows how to integrate ZAP into CircleCI to scan the application with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;url: &lt;a href="http://192.168.1.10"&gt;http://192.168.1.10&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Authentication header name: Authorization&lt;/li&gt;
&lt;li&gt;Authentication header value: authrozation_token_here&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add the following Environment Variables into your project env in the CircleCI:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZAP_AUTH_HEADER_VALUE=api_token_value
ZAP_AUTH_HEADER=Authorization
ZAP_AUTH_HEADER_SITE=target_url
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: the ZAP_AUTH_HEADER_SITE value should exclude the http/https protocol and port, e.g. for the target &lt;a href="https://www.this-is-a-target.com:8080"&gt;https://www.this-is-a-target.com:8080&lt;/a&gt;, the ZAP_AUTH_HEADER_SITE value should be &lt;a href="http://www.this-is-a-target.com"&gt;www.this-is-a-target.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Note: Please change the header name to "Cookie" if your application is authenticated by cookie/session.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add the following content in .circleci/config.yml:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owasp/zap2docker-stable&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
              &lt;span class="s"&gt;mkdir /zap/wrk&lt;/span&gt;
              &lt;span class="s"&gt;zap-full-scan.py -t https://target-url -r report.html&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;store_artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/zap/wrk&lt;/span&gt;
          &lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zap-report&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;After executing the above commands, a zap-report/report.html should be generated in the pipeline artifacts, it contains the test results.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>owasp</category>
      <category>dast</category>
      <category>security</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Getting hard disk info in mac using terminal</title>
      <dc:creator>Kishan B</dc:creator>
      <pubDate>Tue, 16 Nov 2021 14:28:04 +0000</pubDate>
      <link>https://dev.to/kishanbsh/getting-hard-disk-info-in-mac-using-terminal-2fn5</link>
      <guid>https://dev.to/kishanbsh/getting-hard-disk-info-in-mac-using-terminal-2fn5</guid>
      <description>&lt;p&gt;Its pretty easy. Just run the &lt;code&gt;diskutil&lt;/code&gt; like the following&lt;/p&gt;

&lt;h2&gt;
  
  
  Command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diskutil info disk0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Output
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   Device Identifier:         disk0
   Device Node:               /dev/disk0
   Whole:                     Yes
   Part of Whole:             disk0
   Device / Media Name:       APPLE SSD AP0256M

   Volume Name:               Not applicable (no file system)
   Mounted:                   Not applicable (no file system)
   File System:               None

   Content (IOContent):       GUID_partition_scheme
   OS Can Be Installed:       No
   Media Type:                Generic
   Protocol:                  PCI-Express
   SMART Status:              Verified

   Disk Size:                 251.0 GB (251000193024 Bytes) (exactly 490234752 512-Byte-Units)
   Device Block Size:         4096 Bytes

   Media OS Use Only:         No
   Media Read-Only:           No
   Volume Read-Only:          Not applicable (no file system)

   Device Location:           Internal
   Removable Media:           Fixed

   Solid State:               Yes
   Virtual:                   No
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>macosx</category>
      <category>terminal</category>
      <category>shell</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Configuring HP deskJet 2700 printer for printing over Wi-Fi</title>
      <dc:creator>Kishan B</dc:creator>
      <pubDate>Mon, 27 Sep 2021 16:46:53 +0000</pubDate>
      <link>https://dev.to/kishanbsh/configuring-hp-deskjet-2700-printer-for-printing-over-wi-fi-4ao5</link>
      <guid>https://dev.to/kishanbsh/configuring-hp-deskjet-2700-printer-for-printing-over-wi-fi-4ao5</guid>
      <description>&lt;p&gt;It was so frustrating for me to connect my printer(HP DeskJet Ink Advantage 2700 All-In-One printer) to print over wifi network and the most calming part in this frustrating experience is the slogan that is stamped on the printer! "Keep it simple" 🤣🤣&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UTM5TO6e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6yyore3zqnmu7i0wm6qx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UTM5TO6e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6yyore3zqnmu7i0wm6qx.jpg" alt="Keep it simple image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is definitely not simple unless you know the trick 😊&lt;/p&gt;

&lt;p&gt;Hence i am writing this blog for my future self and also people who face the same issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instructions for a successful setup over Wi-Fi(using mobile app)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Ensure your mobile is connected to a Wi-Fi.&lt;/li&gt;
&lt;li&gt;Install both HP smart and HP print service plugin mobile apps. If you are facing difficulties in finding these apps kindly visit &lt;a href="https://123.hp.com"&gt;https://123.hp.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The most important secret is this, On the printer hold the Wireless button and cancel button for 3 seconds. The power button will blink for a few seconds, and the printer will be in setup mode(The wireless button will continue to blink until the printer is connected to the Wi-Fi network.)
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LcbhYu2E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x13j2sva4qx6uya4jaiw.jpg" alt="Wireless button and cancel button image"&gt;
&lt;/li&gt;
&lt;li&gt;Once this is done, add your printer as a new printer, in your mobile app and follow the steps in the apps. These steps apply even if you are changing from one wireless network to another. (Follow left to right in the image below)
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8p9vCTDv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y1i2u1tdg7ogqp2p1e6f.png" alt="Mobile app workflow image"&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>printer</category>
      <category>hp</category>
      <category>wifi</category>
    </item>
    <item>
      <title>Exposing custom prometheus metrics with dynamic labels in gin framework</title>
      <dc:creator>Kishan B</dc:creator>
      <pubDate>Fri, 17 Sep 2021 10:55:26 +0000</pubDate>
      <link>https://dev.to/kishanbsh/capturing-custom-last-request-time-metrics-using-prometheus-in-gin-36d6</link>
      <guid>https://dev.to/kishanbsh/capturing-custom-last-request-time-metrics-using-prometheus-in-gin-36d6</guid>
      <description>&lt;p&gt;We will be using &lt;a href="https://golang.org/"&gt;golang&lt;/a&gt;, &lt;a href="https://github.com/gin-gonic/gin"&gt;gin&lt;/a&gt;, &lt;a href="https://github.com/prometheus/client_golang"&gt;prometheus go library&lt;/a&gt; to expose last request time metrics &lt;/p&gt;

&lt;h2&gt;
  
  
  Out of the box metrics
&lt;/h2&gt;

&lt;p&gt;Spin up a gin go application which exposes the metrics which comes out of the box via the /metrics endpoint&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/gin-gonic/gin"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/prometheus/client_golang/prometheus/promhttp"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/metrics"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;promhttp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ServeHTTP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":8080"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatalln&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the application using command &lt;code&gt;go run main.go&lt;/code&gt; and&lt;br&gt;
When you hit the &lt;code&gt;/metrics&lt;/code&gt; you will see the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl http://localhost:8080/metrics

&lt;span class="c"&gt;# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.&lt;/span&gt;
&lt;span class="c"&gt;# TYPE go_gc_duration_seconds summary&lt;/span&gt;
go_gc_duration_seconds&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;quantile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"0"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; 0
go_gc_duration_seconds&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;quantile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"0.25"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; 0
go_gc_duration_seconds&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;quantile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"0.5"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; 0
go_gc_duration_seconds&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;quantile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"0.75"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; 0
go_gc_duration_seconds&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;quantile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; 0
go_gc_duration_seconds_sum 0
go_gc_duration_seconds_count 0
&lt;span class="c"&gt;# HELP go_threads Number of OS threads created.&lt;/span&gt;
&lt;span class="c"&gt;# TYPE go_threads gauge&lt;/span&gt;
go_threads 7
&lt;span class="c"&gt;# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.&lt;/span&gt;
&lt;span class="c"&gt;# TYPE promhttp_metric_handler_requests_in_flight gauge&lt;/span&gt;
promhttp_metric_handler_requests_in_flight 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Truncated the above for brevity)&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom last_request_received_time metric
&lt;/h2&gt;

&lt;p&gt;Now let us expose our custom metric which is the last request time stamp&lt;/p&gt;

&lt;p&gt;Going with &lt;a href="https://prometheus.io/docs/concepts/metric_types/#gauge"&gt;gauge data type&lt;/a&gt; as for this use case we are "setting" the value as a timestamp&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/gin-gonic/gin"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/prometheus/client_golang/prometheus"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/prometheus/client_golang/prometheus/promhttp"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c"&gt;// Gauge registration&lt;/span&gt;
    &lt;span class="n"&gt;lastRequestReceivedTime&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewGauge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GaugeOpts&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"last_request_received_time"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Help&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Time when the last request was processed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lastRequestReceivedTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;handleErr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Middleware to set lastRequestReceivedTime for all requests&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;lastRequestReceivedTime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetToCurrentTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="c"&gt;// Metrics handler&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/metrics"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;promhttp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ServeHTTP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":8080"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;handleErr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;handleErr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatalln&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So now when you hit the metrics endpoint you will observe the newly created &lt;code&gt;last_request_received_time&lt;/code&gt; metric.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl http://localhost:8080/metrics

&lt;span class="c"&gt;# HELP last_request_received_time Time when the last request was processed&lt;/span&gt;
&lt;span class="c"&gt;# TYPE last_request_received_time gauge&lt;/span&gt;
last_request_received_time 1.63186694449664e+09
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(removed the other metrics for brevity)&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom last_request_received_time with dynamic labels
&lt;/h2&gt;

&lt;p&gt;Now say we want to categorize this based on HTTP headers(Eg userId, Operation type). What this means is the label names are constant but the values are different. &lt;br&gt;
For this case we have the &lt;a href="https://pkg.go.dev/github.com/prometheus/client_golang/prometheus#GaugeVec"&gt;GaugeVec&lt;/a&gt; type in the library&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/gin-gonic/gin"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/prometheus/client_golang/prometheus"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/prometheus/client_golang/prometheus/promhttp"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;HeaderUserId&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"user_id"&lt;/span&gt;
    &lt;span class="n"&gt;HeaderOperationType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"operation_type"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c"&gt;// Gauge registration&lt;/span&gt;
    &lt;span class="n"&gt;lastRequestReceivedTime&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewGaugeVec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GaugeOpts&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"last_request_received_time"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Help&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Time when the last request was processed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;HeaderUserId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HeaderOperationType&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lastRequestReceivedTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;handleErr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Metrics handler&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/metrics"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;promhttp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ServeHTTP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="c"&gt;// Middleware to set lastRequestReceivedTime for all requests&lt;/span&gt;
    &lt;span class="n"&gt;middleware&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;lastRequestReceivedTime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;With&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Labels&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;HeaderUserId&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;        &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HeaderUserId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;HeaderOperationType&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HeaderOperationType&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetToCurrentTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Request handler&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusOK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":8080"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;handleErr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;handleErr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatalln&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"user_id: user1"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"operation_type: fetch"&lt;/span&gt; http://localhost:8080/data
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;:&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"user_id: user1"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"operation_type: view"&lt;/span&gt; http://localhost:8080/data
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;:&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"user_id: user1"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"operation_type: upload"&lt;/span&gt; http://localhost:8080/data
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;:&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl http://localhost:8080/metrics

&lt;span class="c"&gt;# HELP last_request_received_time Time when the last request was processed&lt;/span&gt;
&lt;span class="c"&gt;# TYPE last_request_received_time gauge&lt;/span&gt;
last_request_received_time&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;operation_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"fetch"&lt;/span&gt;,user_id&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"user1"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; 1.6318757060797539e+09
last_request_received_time&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;operation_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"upload"&lt;/span&gt;,user_id&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"user1"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; 1.631875691071805e+09
last_request_received_time&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;operation_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"view"&lt;/span&gt;,user_id&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"user1"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; 1.631875931726781e+09
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we see above for the same metric we have different valued labels&lt;/p&gt;

&lt;p&gt;The code for this is available at&lt;br&gt;
&lt;a href="https://github.com/kishaningithub/lastrequesttimemetrics"&gt;https://github.com/kishaningithub/lastrequesttimemetrics&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback is welcome :-)&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/65608610/how-to-use-gin-as-a-server-to-write-prometheus-exporter-metrics"&gt;https://stackoverflow.com/questions/65608610/how-to-use-gin-as-a-server-to-write-prometheus-exporter-metrics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prometheus.io/docs/guides/go-application/"&gt;https://prometheus.io/docs/guides/go-application/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pkg.go.dev/github.com/prometheus/client_golang/prometheus#GaugeVec"&gt;https://pkg.go.dev/github.com/prometheus/client_golang/prometheus#GaugeVec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>prometheus</category>
      <category>gin</category>
      <category>go</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Openssl by Example</title>
      <dc:creator>Kishan B</dc:creator>
      <pubDate>Wed, 28 Jul 2021 06:11:17 +0000</pubDate>
      <link>https://dev.to/kishanbsh/openssl-by-example-gh</link>
      <guid>https://dev.to/kishanbsh/openssl-by-example-gh</guid>
      <description>&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Symmetric key

&lt;ul&gt;
&lt;li&gt;Encryption&lt;/li&gt;
&lt;li&gt;Decryption&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
Asymmetric key

&lt;ul&gt;
&lt;li&gt;
Key Generation

&lt;ul&gt;
&lt;li&gt;Public key&lt;/li&gt;
&lt;li&gt;Private key&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Encryption&lt;/li&gt;
&lt;li&gt;Decryption&lt;/li&gt;
&lt;li&gt;Sending signed messages&lt;/li&gt;
&lt;li&gt;Reading signed messages&lt;/li&gt;
&lt;li&gt;Encrypting private key&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Others

&lt;ul&gt;
&lt;li&gt;Find openssl version&lt;/li&gt;
&lt;li&gt;List ciphers&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Symmetric key
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Encryption
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"top secret text"&lt;/span&gt; | openssl enc &lt;span class="nt"&gt;-aes-256-cbc&lt;/span&gt; &lt;span class="nt"&gt;-base64&lt;/span&gt;
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;encrypted&lt;/span&gt;&lt;span class="sh"&gt; text &amp;gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Decryption
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;&amp;lt; encrypted text &amp;gt;&amp;gt;"&lt;/span&gt; | openssl enc &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-aes-256-cbc&lt;/span&gt; &lt;span class="nt"&gt;-base64&lt;/span&gt;
enter aes-256-cbc decryption password:
top secret text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Asymmetric key
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Key Generation
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Public key
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl genrsa &lt;span class="nt"&gt;-out&lt;/span&gt; private.pem 2048
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Private key
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl rsa &lt;span class="nt"&gt;-in&lt;/span&gt; private.pem &lt;span class="nt"&gt;-pubout&lt;/span&gt; &lt;span class="nt"&gt;-out&lt;/span&gt; public.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Encryption
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl rsautl &lt;span class="nt"&gt;-encrypt&lt;/span&gt; &lt;span class="nt"&gt;-in&lt;/span&gt; secret-transmission.txt &lt;span class="nt"&gt;-out&lt;/span&gt; secret-transmission.txt.enc &lt;span class="nt"&gt;-inkey&lt;/span&gt; public.pem &lt;span class="nt"&gt;-pubin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Decryption
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl rsautl &lt;span class="nt"&gt;-decrypt&lt;/span&gt; &lt;span class="nt"&gt;-in&lt;/span&gt; secret-transmission.txt.enc &lt;span class="nt"&gt;-out&lt;/span&gt; secret-transmission.txt &lt;span class="nt"&gt;-inkey&lt;/span&gt; private.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sending signed messages
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl rsautl &lt;span class="nt"&gt;-sign&lt;/span&gt; &lt;span class="nt"&gt;-in&lt;/span&gt; secret-transmission.txt &lt;span class="nt"&gt;-out&lt;/span&gt; secret-transmission.txt.enc.signed &lt;span class="nt"&gt;-inkey&lt;/span&gt; private.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reading signed messages
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl rsautl &lt;span class="nt"&gt;-verify&lt;/span&gt; &lt;span class="nt"&gt;-in&lt;/span&gt; secret-transmission.txt.enc.signed &lt;span class="nt"&gt;-out&lt;/span&gt; secret-transmission.txt &lt;span class="nt"&gt;-inkey&lt;/span&gt; public.pem &lt;span class="nt"&gt;-pubin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Encrypting private key
&lt;/h3&gt;

&lt;p&gt;Never store private key in clear text format!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl rsa &lt;span class="nt"&gt;-in&lt;/span&gt; private.pem &lt;span class="nt"&gt;-des3&lt;/span&gt; &lt;span class="nt"&gt;-out&lt;/span&gt; private-enc.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Others
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Find openssl version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;openssl version
LibreSSL 2.6.4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  List ciphers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl list-cipher-commands
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>security</category>
      <category>tooling</category>
      <category>linux</category>
      <category>openssl</category>
    </item>
  </channel>
</rss>
