<?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>Forem: Ali Orhun Akkirman</title>
    <description>The latest articles on Forem by Ali Orhun Akkirman (@aliorhun).</description>
    <link>https://forem.com/aliorhun</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%2F33340%2F7064d56e-ab76-4c00-b0aa-6bb1b2fe44cb.png</url>
      <title>Forem: Ali Orhun Akkirman</title>
      <link>https://forem.com/aliorhun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/aliorhun"/>
    <language>en</language>
    <item>
      <title>Python ile basit bir MCP Sunucu-İstemci örneği</title>
      <dc:creator>Ali Orhun Akkirman</dc:creator>
      <pubDate>Tue, 02 Sep 2025 21:04:17 +0000</pubDate>
      <link>https://forem.com/aciklab/python-ile-basit-bir-mcp-sunucu-istemci-ornegi-7a8</link>
      <guid>https://forem.com/aciklab/python-ile-basit-bir-mcp-sunucu-istemci-ornegi-7a8</guid>
      <description>&lt;p&gt;LLM'lerin araçlarla etkileşimi konusunda önemli bir adım olan MCP için python üzerinde en temelde &lt;strong&gt;FastMCP&lt;/strong&gt; aracı kullanılmakta. Tabi ki bu araçlar sürekli güncellenip gelişmekte fakat yine de bu tarih için en geniş kullanıma sahip kütüphanesi olarak düşünülebilir.&lt;/p&gt;

&lt;h1&gt;
  
  
  MCP Sunucu Kurulum
&lt;/h1&gt;

&lt;p&gt;Öncelikle mimarideki MCP sunucu kurulumu için aşağıdaki komutla fastmcp modülünün kurulması gerekmektedir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip instal fastmcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komutla birlikte sistemde Python üzerinde fastmcp modülü kullanılabilir duruma gelinmekte.&lt;/p&gt;

&lt;h1&gt;
  
  
  MCP Sunucu Yapılandırma
&lt;/h1&gt;

&lt;p&gt;Bu adımdan sonra bir de basit bir sunucu uygulaması hazırlayalım. Uygulamanın test açısından son hali aşağıdaki gibi düşünebiliriz. Buradaki örnekte basit bir mcp fonksiyon aracı ile başka bir REST API'yi çağıran farklı bir fonksiyon aracının da bulunduğunu göreceğiz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;starlette.applications&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Starlette&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;starlette.routing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mount&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mcp.server.sse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SseServerTransport&lt;/span&gt;

&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Test MCP Sunucusu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Merhaba &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;exTool1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Kullanıcı &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; !&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;transport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SseServerTransport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/messages/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_sse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect_sse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;receive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_send&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;as &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in_stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out_stream&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_mcp_server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;in_stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;out_stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_mcp_server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_initialization_options&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getirHavaDurumu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sehir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.open-meteo.com/v1/forecast?latitude=41.01&amp;amp;longitude=28.97&amp;amp;current_weather=true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sehir&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sehir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sonuc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;current_weather&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;

&lt;span class="c1"&gt;#Build a small Starlette app for the two MCP endpoints
&lt;/span&gt;&lt;span class="n"&gt;sse_app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Starlette&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;routes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/sse&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handle_sse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
        &lt;span class="c1"&gt;# Note the trailing slash to avoid 307 redirects
&lt;/span&gt;        &lt;span class="nc"&gt;Mount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/messages/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handle_post_message&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu uygulamadaki en önemli parça &lt;a class="mentioned-user" href="https://dev.to/mcp"&gt;@mcp&lt;/a&gt;.tool() ile başlayan kısımlar. Bu kısımlar istemci (client) üzerinde kullanılabilir araç olarak görülebilecektir. Örneğin yukarıdaki uygulamada hello, exTool1 ve getirHavaDurumu şeklinde 3 tane araç bulunmakta.&lt;/p&gt;

&lt;p&gt;Her araç için fonksiyon içerisindeki parametreler aldığını görmekteyiz. Örneğin hello'da name, exTool1'de user ve getirHavaDurumu'nda ise sehir olacak şekilde. Bu parametrelerin kullanımı fonksiyon içerisinde net bir şekilde anlaşıldığını düşünüyorum. Bir örnek açısından yukarıdaki uygulamada sehir parametresi requests modülü ile open-meteo API'sine sorgu atararak sıcaklık ve rüzgar değerlerini çekebilmekte.&lt;/p&gt;

&lt;p&gt;Diğer kısımlara şuan için girmiyorum.&lt;/p&gt;

&lt;p&gt;Bu adımdan sonra hangi isimle dosyayı kaydederseniz bu şekilde çağırmanız yeterli.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 server.py 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komutun çıktısı aşağıdaki gibi olması beklenmekte.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;╭────────────────────────────────────────────────────────────────────────────╮
│                                                                            │
│        _ __ ___  _____           __  __  _____________    ____    ____     │
│       _ __ ___ .'____/___ ______/ /_/  |/  / ____/ __ \  |___ \  / __ \    │
│      _ __ ___ / /_  / __ `/ ___/ __/ /|_/ / /   / /_/ /  ___/ / / / / /    │
│     _ __ ___ / __/ / /_/ (__  ) /_/ /  / / /___/ ____/  /  __/_/ /_/ /     │
│    _ __ ___ /_/    \____/____/\__/_/  /_/\____/_/      /_____(*)____/      │
│                                                                            
│                                FastMCP  2.0                                │
│               🖥️  Server name:     Test MCP Sunucusu                          │
│               📦 Transport:       Streamable-HTTP                          │
│               🔗 Server URL:      http://127.0.0.1:8000/mcp                │
│               🏎️  FastMCP version: 2.12.0                                   │
│               🤝 MCP SDK version: 1.13.1                                   │
│               📚 Docs:            https://gofastmcp.com                    │
│               🚀 Deploy:          https://fastmcp.cloud                    │
╰────────────────────────────────────────────────────────────────────────────╯


[09/02/25 23:45:24] INFO     Starting MCP server 'Test MCP Server'    server.py:1571
                             with transport 'http' on                               
                             http://127.0.0.1:8000/mcp                              
INFO:     Started server process [281559]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu çıktı ile MCP sunucumuzun 8000 portu üzerinden ayağa kalktığını söyleyebiliriz.&lt;/p&gt;

&lt;h1&gt;
  
  
  Sıra geldi MCP İstemciye
&lt;/h1&gt;

&lt;p&gt;İstemci yapılandırılması için ise aşağıdaki uygulamayı kullanacağız.&lt;/p&gt;

&lt;p&gt;Öncelikle kurulum için aşağıdaki komutu kullanabiliriz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"mcp[cli]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sonrasında sunucuyu kullanacak olan örnek bir istemci uygulaması aşağıdaki gibi kurgulanabilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ast&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pprint&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastmcp.client.transports&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StreamableHttpTransport&lt;/span&gt;

&lt;span class="c1"&gt;# --- Configuration ---
&lt;/span&gt;&lt;span class="n"&gt;SERVER_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:8000/mcp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;pp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PrettyPrinter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;unwrap_tool_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Safely unwraps the content from a FastMCP tool call result object.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# The content is a list containing a single content object
&lt;/span&gt;        &lt;span class="n"&gt;content_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="c1"&gt;# It could be JSON or plain text
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content_object&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;content_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content_object&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="c1"&gt;# Use ast.literal_eval for safely evaluating a string containing a Python literal
&lt;/span&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;literal_eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;SyntaxError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="c1"&gt;# If it's not a literal, return the raw text
&lt;/span&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;content_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;transport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StreamableHttpTransport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SERVER_URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Connecting to FastMCP server at:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SERVER_URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# 1. Ping to test connectivity
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Testing server connectivity...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ Server is reachable!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 2. Discover server capabilities
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🛠️   Available tools:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list_tools&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;📚 Available resources:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list_resources&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;💬 Available prompts:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list_prompts&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

       &lt;span class="c1"&gt;# 3. Test tool
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;🔍 Testing tool: havadurumu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;raw_search&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;getirHavaDurumu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sehir&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zonguldak&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,},&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;search_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;unwrap_tool_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw_search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;search_results&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;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu uygulamadaki en önemli kısım ise yapılandırma kısmındaki SERVER_URL olarak sunucunun adres ve portunun yazılması gerekliliği olacak.&lt;/p&gt;

&lt;p&gt;Sonrasında FastMCP araç çağrısını okunabilir noktaya getirecek unwrap_tool_result fonksiyonunu görüyoruz.&lt;/p&gt;

&lt;p&gt;Ama asıl önemli kısım main fonksiyonunda yer alan kısımlar.&lt;/p&gt;

&lt;p&gt;İlk adımda sunucuya sağlıklı erişip erişmediğinin kontrolü, sonrasında da sunucuda yer alan araç, kaynak ve prompt değerlerini göstermekte. Şuan için sadece araç kullandığımız için diğerleri boş gelecektir.&lt;/p&gt;

&lt;p&gt;Araçlar içerisinde de hava durumunu sorguladığımız ve örnekte "zonguldak" ili için hava durumunu sorguladığımızı gösterecek.&lt;/p&gt;

&lt;p&gt;Dolayısıyla aşağıdaki komut ile istemci uygulaması çalıştırılabilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 client.py 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komutun çıktısı da aşağıdaki gibi olacağı öngörülmekte.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Connecting to FastMCP server at: http://localhost:8000/mcp

Testing server connectivity...
✅ Server is reachable!

🛠️  Available tools:
[ Tool(name='hello', title=None, description=None, inputSchema={'properties': {'name': {'title': 'Name', 'type': 'string'}}, 'required': ['name'], 'type': 'object'}, outputSchema={'properties': {'result': {'title': 'Result', 'type': 'string'}}, 'required': ['result'], 'title': '_WrappedResult', 'type': 'object', 'x-fastmcp-wrap-result': True}, annotations=None, meta={'_fastmcp': {'tags': []}}),
  Tool(name='exTool1', title=None, description=None, inputSchema={'properties': {'user': {'title': 'User', 'type': 'string'}}, 'required': ['user'], 'type': 'object'}, outputSchema={'properties': {'result': {'title': 'Result', 'type': 'string'}}, 'required': ['result'], 'title': '_WrappedResult', 'type': 'object', 'x-fastmcp-wrap-result': True}, annotations=None, meta={'_fastmcp': {'tags': []}}),
  Tool(name='getirHavaDurumu', title=None, description=None, inputSchema={'properties': {'sehir': {'title': 'Sehir', 'type': 'string'}}, 'required': ['sehir'], 'type': 'object'}, outputSchema={'additionalProperties': True, 'type': 'object'}, annotations=None, meta={'_fastmcp': {'tags': []}})]

📚 Available resources:
[]

💬 Available prompts:
[]


🔍 Testing tool: havadurumu
&amp;lt;bound method BaseModel.json of TextContent(type='text', text='{"sehir":"zonguldak","sonuc":{"time":"2025-09-02T20:45","interval":900,"temperature":22.8,"windspeed":3.0,"winddirection":14,"is_day":0,"weathercode":1}}', annotations=None, meta=None)&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Tüm bu adımlarla birlikte aslında basitçe bir MCP sunucu-istemci uygulamasını ayağa kaldırıp kullanmış oluyoruz.&lt;/p&gt;

&lt;p&gt;Tabi ki bu yazıda MCP uygulamasının detaylarına, LLM'lerle ilişkisine veya farklı detaylı konulara girmeden basitçe kullanımını derli toplu hazırlamak istedim. Umarım yeni başlayanlar için faydalı bir yazı olur.&lt;/p&gt;

&lt;p&gt;Kaynak olarak kullandığım &lt;a href="https://www.datacamp.com/tutorial/building-mcp-server-client-fastmcp" rel="noopener noreferrer"&gt;adres&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;~~~~&lt;del&gt;&lt;/del&gt;~~&lt;del&gt;&lt;/del&gt;~~&lt;del&gt;&lt;/del&gt;~~&lt;del&gt;&lt;/del&gt;~~&lt;del&gt;&lt;/del&gt;~~&lt;del&gt;&lt;/del&gt;~~~~&lt;/p&gt;

&lt;p&gt;"Her yeni başlangıç, başka bir başlangıcın sonundan gelir."  Seneca&lt;/p&gt;

</description>
      <category>python</category>
      <category>mcp</category>
      <category>fastmcp</category>
      <category>llm</category>
    </item>
    <item>
      <title>Liman Çekirdek 2.2 Duyuruldu</title>
      <dc:creator>Ali Orhun Akkirman</dc:creator>
      <pubDate>Tue, 15 Apr 2025 19:03:12 +0000</pubDate>
      <link>https://forem.com/liman/liman-cekirdek-22-duyuruldu-1e1k</link>
      <guid>https://forem.com/liman/liman-cekirdek-22-duyuruldu-1e1k</guid>
      <description>&lt;p&gt;HAVELSAN tarafından, açık kaynak MIT lisansı ile geliştirilen Liman Çekirdek 2.2 sürümü 15 Nisan 2025 tarihinde &lt;a href="https://github.com/limanmys/core/releases/tag/release.master.1033" rel="noopener noreferrer"&gt;duyuruldu&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Liman Çekirdek üzerinde kurumsal ihtiyaçlara uygun şekilde geliştirilen "Liman Kurumsal" sürüm için &lt;a href="https://liman.havelsan.com.tr" rel="noopener noreferrer"&gt;https://liman.havelsan.com.tr&lt;/a&gt; adresi ile iletişime geçilebilir.&lt;/p&gt;

&lt;h1&gt;
  
  
  Kod yapısı ve sürüm
&lt;/h1&gt;

&lt;p&gt;İlgili sürümde altyapı ve görsellik olarak bir çok güncelleme içermektedir. Tüm değişiklikler ve sürüme erişim için aşağıdaki bağlantı kullanılabilir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/limanmys/core/releases/tag/release.master.1033" rel="noopener noreferrer"&gt;https://github.com/limanmys/core/releases/tag/release.master.1033&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Kurulum ve güncelleme süreçleri
&lt;/h1&gt;

&lt;p&gt;Kurulum ve güncelleme süreçleri için ise aşağıdaki bağlantı kullanılabilir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.liman.dev/baslangic/kurulum" rel="noopener noreferrer"&gt;https://docs.liman.dev/baslangic/kurulum&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Liman Çekirdek 2.2 ile gelen temel değişiklikler
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Ortam yapılandırma güncellemeleri
&lt;/h2&gt;

&lt;p&gt;.env.example dosyasına Laravel Reverb için yeni WebSocket ayarları (REVERB_APP_ID, REVERB_APP_KEY, vb.) eklendi.&lt;/p&gt;

&lt;h2&gt;
  
  
  PHP sürüm yükseltme
&lt;/h2&gt;

&lt;p&gt;.github/workflows/main.yml ve Dockerfile dosyalarında PHP sürümü 8.1'den 8.4'e yükseltildi.&lt;/p&gt;

&lt;h2&gt;
  
  
  keycloak rol önbellekleme
&lt;/h2&gt;

&lt;p&gt;KeycloakAuthenticator içinde kullanıcı rolleri Redis'te önbelleğe alındı.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yeni API uçnoktası
&lt;/h2&gt;

&lt;p&gt;Liman kullanıcılarını getirmek için InternalController'a /getLimanUsers eklendi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yönlendirme değişiklikleri
&lt;/h2&gt;

&lt;p&gt;_routes.php dosyasına yeni API uç noktası için bir rota (SandboxGetLimanUsers) eklendi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yapılandırma düzenleyici değişikliği
&lt;/h2&gt;

&lt;p&gt;Helpers.php dosyasında Jackiedo\DotenvEditor yerine sixlive\DotenvEditor kullanıldı.&lt;/p&gt;

&lt;h2&gt;
  
  
  CSRF Muafiyetleri
&lt;/h2&gt;

&lt;p&gt;CSRF istisnalarına /lmn/private/getLimanUsers eklendi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Laravel sürüm yükseltme
&lt;/h2&gt;

&lt;p&gt;Laravel 12 sürümüne yükseltildi ve yeni websoket sağlayıcısı olarak Laravel Reverb kullanıldı.&lt;/p&gt;

</description>
      <category>liman</category>
      <category>cekirdek</category>
      <category>core</category>
    </item>
    <item>
      <title>ScratchJr dosyasının anatomisi</title>
      <dc:creator>Ali Orhun Akkirman</dc:creator>
      <pubDate>Sun, 29 Sep 2024 10:20:34 +0000</pubDate>
      <link>https://forem.com/aliorhun/scratchjr-dosyasinin-anatomisi-5cf7</link>
      <guid>https://forem.com/aliorhun/scratchjr-dosyasinin-anatomisi-5cf7</guid>
      <description>&lt;p&gt;&lt;strong&gt;ScratchJR&lt;/strong&gt;, erken yaş çocuklar için kodlamaya ilk adım atabileceği güzel bir uygulama. &lt;strong&gt;Scratch&lt;/strong&gt;'in aksine "metin blokları" ile değil "&lt;strong&gt;ikon blokları&lt;/strong&gt;" ile programlamaya izin vermektedir. Bu nedenle bazı özellikleri daha kısıtlı olmasının yanında, bazı özelliklerde de basite kaçıldığını söyleyebilirim. Özellikle ilgileniyorsanız &lt;a href="https://aliorhun.medium.com/i%CC%87kon-bloklar%C4%B1-ile-kodlama-1a45fc4c91d5" rel="noopener noreferrer"&gt;ikon blokları ile kodlama konusundaki yazım&lt;/a&gt;ı okuyabilirsiniz.&lt;/p&gt;

&lt;p&gt;Buradaki konumuz ise, ScratchJR'da yaptığınız kodlamanın kaydedildikten sonra oluşan ".SJR" dosya formatının içeriği konusu. Öncelikle ScratchJR, şuan itibariyle tabletler ve cep telefonlarından çalışacak şekilde &lt;a href="https://www.scratchjr.org/" rel="noopener noreferrer"&gt;tasarlanmış&lt;/a&gt;. Dolayısıyla web tarayıcılar üzerinden bir erişim bulunmamakta. Web tarayıcılar üzerinde çalışabilecek gayriresmi bazı sayfalar bulunmakta fakat birebir destek olmadığı için problem çıkartması çok doğal olabileceğini söylemek isterim. &lt;/p&gt;

&lt;h1&gt;
  
  
  SJR dosyası içeriği
&lt;/h1&gt;

&lt;p&gt;Öncelikle &lt;strong&gt;SJR&lt;/strong&gt; dosyası klasik bir &lt;strong&gt;ZIP&lt;/strong&gt; sıkılaştırma formatı ile sıkılaştırılmış bir klasörü içermekte. Dolayısıyla ilgili dosyası "çıkartma/extract" yöntemi ile açtığınızda içerisinden aşağıdaki gibi bir klasör yapısı göreceksiniz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project
|-- thumbnails
|   |-- 0_6e035782797023d0340f2ef9d6cdc81c.png
|-- sounds
|   |-- 2bd509af-f830-4bea-bb0f-d9d2640ed948.webm
|   |-- d9d2640ed948-f830.wav
|-- characters
|   |-- 2bd509af2bd509af2bd509af2bd509af.svg
|-- backgrounds
|   |-- 76570abb3c400dd8c6ed16e48ab4a00d.svg
|-- data.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Öncelikle project isminde bir klasör oluşup, bu klasör içerisinde aşağıdaki alt klasörler bulunmaktadır. Tabi ki sizin projenizde "custom" olarak düzenlediğiniz pek bir şey yoksa sadece thumbnails bulunması da olası.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;thumbnails&lt;/li&gt;
&lt;li&gt;sounds&lt;/li&gt;
&lt;li&gt;characters&lt;/li&gt;
&lt;li&gt;backgrounds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu alt klasörleri sırası ile inceleyelim. Sonrasında ise data.json dosyasını inceleyeceğiz.&lt;/p&gt;

&lt;h2&gt;
  
  
  thumbnails
&lt;/h2&gt;

&lt;p&gt;Projenin sayfaları hakkında kısa görseller barındıran dosya. Muhtemelen sadece png formatında kullanılmakta. İşlevselliğe pek bir katkısı olmadığını söyleyebilirim.&lt;/p&gt;

&lt;h2&gt;
  
  
  sounds
&lt;/h2&gt;

&lt;p&gt;Projede mikrofon ile oluşturduğunuz ses kayıtlarını barındıran klasör. Varsayılanda bu klasör oluşmuyor fakat ses kaydı eklerseniz oluşmakta. İçerisindeki dosya wav veya webm formatında olabiliyor. Wav olmasının tercih edilmesini daha doğru buluyorum. Sizler de uygulama dışında da oluşturduğunuz/çevirdiğiniz ses kayıtlarını buraya koyabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  characters
&lt;/h2&gt;

&lt;p&gt;Projede karakter olarak oluşturduğunuz görselleri içermektedir. Karakterler svg yani vektörel formatta kaydedilmeli. Daha sonra bu konu ile ilgili daha geniş bir yazı da hazırlamak istiyorum çünkü mevcut uygulama ile sadece karakter çizimi yapılabilip, web kamerası ile görüntü eklenebiliyor. Herhangi bir formatta görsel veya resim eklenmesi olmuyor. Fakat buradaki klasöre elle eklenen dosyalar daha sonra uygulamadan görüntülenip kullanılabiliyor.&lt;/p&gt;

&lt;h2&gt;
  
  
  backgrounds
&lt;/h2&gt;

&lt;p&gt;Projede sayfalarda çeşitli arkaplanlar kullanılabiliyor fakat kendiniz elle çizdiğiniz bir arkaplan kullandığınızda bu klasör oluşuyor. Karakterlerde olduğu gibi svg yani vektörel dosya kabul etmekte. Dolayısıyla karakterde olduğu gibi sonradan da yeni arkaplan resimleri eklenebilmekte.&lt;/p&gt;

&lt;h1&gt;
  
  
  SJR içerisindeki data.json dosyası
&lt;/h1&gt;

&lt;p&gt;SJR dosyası yani projenizdeki işlevler bu dosya içerisinde tanımlanmaktadır. Önceki bölümde bahsettiğimiz tüm dosyalar kaynak dosya olarak düşünürsek bu kaynak verilerin nerede kullanıldığı ve neler yapacağı tam olarak bu dosya içerisinde tanımlanmaktadır.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuv53h8v7ztw2ly879hwf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuv53h8v7ztw2ly879hwf.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu dosya adında da barındırdığı şekilde &lt;strong&gt;JSON&lt;/strong&gt; formatında hazırlanmış olup üstteki büyük obje içerisinde id, zaman, isim, sürüm, giftolupolmaması, silinmişolupolmaması gibi değişkenlerin yanında; "json" adında(standartı saçmalatmışlar) ve thumbnail adında başka bir nesne ayrımına girmekte. thumbnail nesnesi düşünüldüğü gibi thumbnail klasöründeki öngösterim görselinin ismini ve projedeki sayfa sayısını barındırmakta.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0ip2ie7kobari54hp4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0ip2ie7kobari54hp4t.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"&lt;strong&gt;json&lt;/strong&gt;" adındaki diğer geniş nesne ise her bir sayfa için detaylı süreçleri barındırmakta. Her bir sayfa için detaylı katmanlar, katmanların hangi karakterleri içerdiği, karakterlerin konumları, ses ilişkileri ve "kodlama" kısmını detaylandıran "&lt;strong&gt;scripts&lt;/strong&gt;" ismindeki nesneyi barındırmakta. Tabi bunlar dışında daha bir çok değer de bulunuyor ama şuanki amacımız bu detay değil. Script nesnesi içinde bir dizi tanımlanmış olup bu dizi içerisinde ikon bloklarına verilen bazı isimler ve bu ikon bloklarının alabileceği parametrelere göre değerler bulunmaktadır. Yani yazılım geliştiricilerin çok rahat anlayabileceği bir yapı olduğu oldukça net.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftk7dmkrvth0q6idbhj17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftk7dmkrvth0q6idbhj17.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Son Söz
&lt;/h1&gt;

&lt;p&gt;Son söz olarak SJR dosyası üzerindeki düzenlemeleri tekrar ZIP formatında sıkılaştırıp ismini SJR olarak verdiğimizde uygulamaya tekrar "import" edilebilmekte. Dolayısıyla çeşitli karakterler, sesler ve arkaplanları oyunlara eklemek isteyenler için oldukça güzel fırsat sunabilmekte.&lt;/p&gt;

</description>
      <category>scratch</category>
      <category>scratchjr</category>
      <category>sjr</category>
      <category>iconblocks</category>
    </item>
    <item>
      <title>Bir sertifikanın belirli bir özel anahtar ile eşleştiğinin kontrol edilmesi</title>
      <dc:creator>Ali Orhun Akkirman</dc:creator>
      <pubDate>Fri, 19 Jul 2024 08:15:16 +0000</pubDate>
      <link>https://forem.com/aciklab/bir-sertifikanin-belirli-bir-ozel-anahtar-ile-eslestiginin-kontrol-edilmesi-3h2j</link>
      <guid>https://forem.com/aciklab/bir-sertifikanin-belirli-bir-ozel-anahtar-ile-eslestiginin-kontrol-edilmesi-3h2j</guid>
      <description>&lt;p&gt;Elinizde bir sunucu sertifikası olduğunu düşünelim. Bu sertifikanın hangi özel anahtar ile oluşturulduğunu merak ediyorsanız bunun için güzel bir yöntem bulunmakta.&lt;/p&gt;

&lt;p&gt;Bu yöntem aslında sertifikanın ve anahtarın benzer "modulus" değerlerine sahip olması gerektiği altyapısıdır.&lt;/p&gt;

&lt;p&gt;Öncelikle sertifikaya erişim oldukça kolay olduğu için sertifika CRT veya PEM formatında aşağıdaki örnekte kullanılacak şekilde "sunucusertifika.pem" isminde dosya olarak kaydedilir. Aşağıdaki komut ile MD5 özet bilgisine erişilebilmektedir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl x509 –noout –modulus –in sunucusertifika.pem | openssl md5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Benzer şekilde CSR dosyası oluşturulan anahtarın da modulus değerinin MD5 özetine bakılması gerekecektir.&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 –noout –modulus –in sunucuanahtar.key | openssl md5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu çalıştırılan iki komut sonrasında çıktılar karşılaştırılır. Her ikisi de aşağıdaki gibi birbiriyle aynı değerleri içeriyorsa aynı anahtar üzerinden talep edilmiş bir sertifika olduğu netleşmiş olacaktır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MD5(stdin)= d432bd98f00b2097632723998ecf8427e
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>openssl</category>
      <category>anahtar</category>
      <category>sertifika</category>
    </item>
    <item>
      <title>WMI ve Uzaktan Erişim</title>
      <dc:creator>Ali Orhun Akkirman</dc:creator>
      <pubDate>Wed, 06 Mar 2024 20:38:30 +0000</pubDate>
      <link>https://forem.com/aciklab/wmi-ve-uzaktan-erisim-1hg2</link>
      <guid>https://forem.com/aciklab/wmi-ve-uzaktan-erisim-1hg2</guid>
      <description>&lt;p&gt;WMI yani "&lt;strong&gt;Windows Management Instrumentation&lt;/strong&gt;", Windows 2000'den beri önkurulu olarak gelen ve Windows işletim sistemi altyapısındaki bir çok bileşenin izlenebilmesi ve yönetilebilmesini sağlayan bir altyapıdır. WMI altyapısı işletim sistemi ile ilgili çeşitli bileşenleri kullanabilmek için endüstri standartı kullanılmaktadır.&lt;/p&gt;

&lt;p&gt;WMI aynı zamanda uzak bilgisayarları yönetmek ve veri edinmek için kullanılan standart yöntemlerden birisidir. WMI altyapısına alternatif olarak Windows'un Windows Remote Management (&lt;strong&gt;WinRM&lt;/strong&gt;) altyapısı da bulunmaktadır ki aslında ilgili yöntem de WS-Management adındaki SOAP tabanlı bir protokolle uzaktaki cihazın WMI altyapısını yönetmeyi içermektedir. &lt;/p&gt;

&lt;h1&gt;
  
  
  WMI altyapısına uzaktan erişim açılması
&lt;/h1&gt;

&lt;p&gt;WMI, uzaktan erişim için DCOM "&lt;strong&gt;Distributed Component Object Model&lt;/strong&gt;" adındaki bir altyapıyı kullanmaktadır. Dolayısıyla uzak erişim sırasında özellikle ilk iki maddenin uzaktan GPO ile veya elle yapılması gerekmektedir. Bu ayarlar yetkisiz bir kullanıcı için de yapılmak isteniyorsa son maddenin, daha detaylı işlemlerin yapılması isteniyorsa da 3. maddenin de yapılması gerekmektedir. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Yerel Güvenlik Duvarı izni &lt;/li&gt;
&lt;li&gt;Uzak WMI yetkisi&lt;/li&gt;
&lt;li&gt;UAC "User Account Control" (bazı durumlarda) &lt;/li&gt;
&lt;li&gt;DCOM objelerine erişim için kullanıcı izinleri (erişecek kullanıcı yetkili bir kullanıcı değil ise yapılması gerekir)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;izinlerine ihtiyaç duymaktadır.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Yerel Güvenlik Duvarı erişim hakkında
&lt;/h2&gt;

&lt;p&gt;Uzaktan WMI erişimi &lt;strong&gt;TCP 135&lt;/strong&gt; portu ve 49152-65535 port aralığında RPC dinamik port aralığını kullanmaktadır. Dolayısıyla uzaktan bağlanılacak makinenin güvenlik duvarı kurallarını port bazında değil standart kurallarla yapılması daha uygun olacaktır. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwogcidd84ojueh16jfr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwogcidd84ojueh16jfr.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;İlgili kuralı belirli bir IP'den erişim alacak şekilde yapılabilmesine ek olarak komut satırı üzerinden de aşağıdaki şekilde yapılabilmektedir.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;netsh advfirewall firewall set rule group="windows management instrumentation (wmi)" new enable=yes&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eğer sadece özel bir IP adresine yetki verilmesi isteniyorsa "remoteip=192.168.0.12" parametresini ekleyebilirsiniz.&lt;/p&gt;

&lt;p&gt;İstenildiği takdirde Microsoft'un belgelerinden ve ekteki kaynaklardan daha detaylı kısıtlı erişim ayarları da yapılabilmektedir.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Uzak WMI yetkisi
&lt;/h2&gt;

&lt;p&gt;Uzak WMI sorgulama yetkisi için "Computer Management" uygulaması içerisindeki WMI Control uygulamasının ayarlarındaki "Güvenlik" kısmında "Root" isimli WMI Namespace'ine remote olarak erişebilecek ve erişemeyecek kişilerin belirlenmesi önemlidir. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsh3if3v89ho5w5xo9cxr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsh3if3v89ho5w5xo9cxr.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uzaktan erişmesi istenen kullanıcı için "Uzak Erişim" yetkisi verilmiş olması gerekecektir. Yine sıkılaştırma için diğer kullanıcılarda bu erişim olmamasına önem gösterilmesi doğru olabilir. Çünkü bu ayar sonucunda hangi kullanıcının WMI objelerine erişebileceği belirlenmektedir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fckp4jxs54czrc2cwk05f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fckp4jxs54czrc2cwk05f.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. UAC "User Account Control"
&lt;/h2&gt;

&lt;p&gt;Temel olarak bu adımın yapılması gerekmemektedir.&lt;/p&gt;

&lt;p&gt;UAC, Microsoft'un görece daha yeni geliştirdiği bir uygulama olarak WMI üzerinde bazı işlemleri yapmanızda filtre uygulayabilir. &lt;/p&gt;

&lt;p&gt;Yine de ileri komutlarda yaşanabilecek olası sorunlar için çözüm regedit üzerinde aşağıdaki adresteki DWORD anahtarını eklemek veya düzenleme yaparak "1" seçilerek filtreyi kapatmak gerekmektedir.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system\LocalAccountTokenFilterPolicy


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

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;0 = Remote UAC access token filtering is enabled.&lt;br&gt;
1 = Remote UAC is disabled.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. DCOM objelerine erişim
&lt;/h2&gt;

&lt;p&gt;Temel olarak bu adımın yapılması gerekmemektedir.&lt;/p&gt;

&lt;p&gt;Bu adım da aslında yetkili olmayan kullanıcılara da DCOM verilerine erişim verilebilmesi dolayısıyla WMI sorgularına cevap dönebilmesi için gereklidir. Fakat hali hazırda yetkili bir kullanıcı ile sorgu atılıyorsa bu adımın yapılması gerekmemektedir.&lt;/p&gt;

&lt;p&gt;Bu adımda yetkisiz bir kullanıcıya iki yetki verilecektir.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DCOM objelerine uzaktan çalıştırma&lt;/li&gt;
&lt;li&gt;DCOM objelerine uzaktan erişim&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu işlemler için dcomcnfg uygulamasında yani "component services" uygulaması içerisinde "my computer" altında "COM Config" kısmına girilir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnv6n2m3kckrty7n5vspi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnv6n2m3kckrty7n5vspi.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Güvenlik sekmesinde önce "Launch and Activation Permission" kısmına sonrasında "Access Permission" kısımlarını düzenlemek gerekecektir. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl0s3f4gv7lzqifufknmf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl0s3f4gv7lzqifufknmf.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Her iki seçenekte de aşağıdaki gibi yetki verilmek istenen kullanıcı için "Remote Launch" içinde "Remote Activation" seçilmesi gerekmektedir. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0m9y9bqveloxcvy4omri.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0m9y9bqveloxcvy4omri.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Kontrol
&lt;/h1&gt;

&lt;p&gt;Ayarlar açıldıktan sonra en temel ve basit kontrol için Powershell betik dili kullanılabilmektedir. Bunun için aşağıdaki betik kullanılabilir:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$strComputer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BilgisayarAdiveyaIP"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$colSettings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_OperatingSystem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Credential&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ACIKLAB\administrator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$strComputer&lt;/span&gt;&lt;span class="w"&gt;


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

&lt;/div&gt;

&lt;p&gt;İlgili betik içerisinde BilgisayarAdiveyaIP stringi yerine IP Adresi de yazılabilmektedir. Credential olarak aşağıdaki tüm tipler kullanılabilmektedir.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kullanici01&lt;/li&gt;
&lt;li&gt;DomainAdi\kullanici01&lt;/li&gt;
&lt;li&gt;&lt;a href="mailto:kullanici@domainadi.lab"&gt;kullanici@domainadi.lab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu adımdan sonra ilgili kullanıcı için parola bilgisi sorulduktan sonra yukarıdaki ağ ve sistem erişim yetkileri doğru şekilde tanımlanmışsa işletim sistemi ile ilgili WMI nesnelerine erişim sağlanabilecektir.&lt;/p&gt;

&lt;p&gt;Sonrasında WMI objelerine erişim konusu ise apayrı bir konu olduğu için bu yazıda değinmiyorum ama ilgili kişiler için aşağıdaki yapıda inceleme yapılabilir.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://powershell.one/wmi/root/cimv2/win32_operatingsystem" rel="noopener noreferrer"&gt;https://powershell.one/wmi/root/cimv2/win32_operatingsystem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-operatingsystem" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-operatingsystem&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  WMIC hakkında
&lt;/h1&gt;

&lt;p&gt;Tüm bu süreçlere ek olarak WMI'ın komut satırından kullanımını sağlayan araç olan &lt;a href="https://learn.microsoft.com/en-us/windows/win32/wmisdk/wmic" rel="noopener noreferrer"&gt;wmic&lt;/a&gt;, 2024 itibariyle desteklenmeyen sürüme düşmüş olup Powershell üzerinden kullanılması önerilmektedir. Dolayısıyla internette bulunabilecek bir çok eski komut yeni sistemlerde çalışmayacaktır.&lt;/p&gt;

&lt;h1&gt;
  
  
  Kaynaklar:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/windows/win32/wmisdk/connecting-to-wmi-remotely-starting-with-vista" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/windows/win32/wmisdk/connecting-to-wmi-remotely-starting-with-vista&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.vscope.net/setting-up-wmi-access-through-ad-gpo" rel="noopener noreferrer"&gt;https://support.vscope.net/setting-up-wmi-access-through-ad-gpo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.heelpbook.net/2018/enable-wmi-windows-management-instrumentation/" rel="noopener noreferrer"&gt;https://www.heelpbook.net/2018/enable-wmi-windows-management-instrumentation/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://softcomet.freshdesk.com/support/solutions/articles/6000222183-using-wmi-without-having-full-administrator-permissions" rel="noopener noreferrer"&gt;https://softcomet.freshdesk.com/support/solutions/articles/6000222183-using-wmi-without-having-full-administrator-permissions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/windows/win32/wmisdk/connecting-to-wmi-on-a-remote-computer" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/windows/win32/wmisdk/connecting-to-wmi-on-a-remote-computer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>wmi</category>
      <category>dcom</category>
      <category>remote</category>
      <category>uzak</category>
    </item>
    <item>
      <title>Liman Çekirdek 2.0 Duyuruldu</title>
      <dc:creator>Ali Orhun Akkirman</dc:creator>
      <pubDate>Mon, 26 Feb 2024 14:15:24 +0000</pubDate>
      <link>https://forem.com/liman/liman-cekirdek-20-duyuruldu-9dl</link>
      <guid>https://forem.com/liman/liman-cekirdek-20-duyuruldu-9dl</guid>
      <description>&lt;p&gt;HAVELSAN tarafından geliştirilen, açık kaynak MIT lisansı ile geliştirilen Liman Çekirdek 2.0 sürümü 26 Şubat 2024 tarihinde duyuruldu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrub3johamnwy0kpu7tq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrub3johamnwy0kpu7tq.png" alt="Image description" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Liman Çekirdek üzerinde kurumsal ihtiyaçlara uygun şekilde geliştirilen "Liman Kurumsal" sürüm için &lt;a href="https://liman.havelsan.com.tr/"&gt;https://liman.havelsan.com.tr/&lt;/a&gt; adresi ile iletişime geçilebilir.&lt;/p&gt;

&lt;p&gt;İlgili sürümde altyapı ve görsellik olarak bir çok güncelleme içermektedir. Tüm değişiklikler ve sürüme erişim için aşağıdaki bağlantı kullanılabilir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/limanmys/core/releases/tag/release.2.0"&gt;https://github.com/limanmys/core/releases/tag/release.2.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kurulum ve güncelleme süreçleri için ise aşağıdaki bağlantı kullanılabilir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.liman.dev/baslangic/kurulum"&gt;https://docs.liman.dev/baslangic/kurulum&lt;/a&gt;&lt;/p&gt;

</description>
      <category>liman</category>
    </item>
    <item>
      <title>Secure boot sistemlerde Sanallaştırma çalıştırma hakkında</title>
      <dc:creator>Ali Orhun Akkirman</dc:creator>
      <pubDate>Mon, 05 Feb 2024 05:51:53 +0000</pubDate>
      <link>https://forem.com/aciklab/secure-boot-sistemlerde-sanallastirma-calistirma-hakkinda-1ggb</link>
      <guid>https://forem.com/aciklab/secure-boot-sistemlerde-sanallastirma-calistirma-hakkinda-1ggb</guid>
      <description>&lt;p&gt;GNU Linux çekirdeğine sahip sistemlerde BIOS üzerinden secure boot açık ise "VMware Workstation" gibi sistemlerde anahtar ve sertifika ile uygulamanın güvenilirliğinin sağlanması gerekmektedir.&lt;/p&gt;

&lt;p&gt;Genellikle VMware üzerinde "&lt;strong&gt;Could not open /dev/vmmon: No such file or directory. Please make sure that the kernel module `vmmon' is loaded.&lt;/strong&gt;" şeklinde bir hata alınarak ortaya çıkmaktadır.&lt;/p&gt;

&lt;p&gt;Problemli olan kısım ise makinede Linux çekirdek sürümü değiştikçe her seferinde bu şekilde güvenliğin açılması gerekmektedir. Sertifikayı her seferinde oluşturmak gerekmemekte fakat enroll etmek gerekmektedir.&lt;/p&gt;

&lt;p&gt;Öncelikle VMware uygulamasının kullanacağı anahtar ve sertifika üretilir:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=VMware/"&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bu şekilde elimizde MOK.dev ve MOK.priv isminde iki adet dosya çıkmakta. Bu dosyalar mevcut Linux çekirdeğine vmmon ve vmnet modlarını mod olarak eklenmesi için aşağıdaki komutlar uygulanır:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
sudo /usr/src/linux-headers-&lt;/code&gt;uname -r&lt;code&gt;/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vmmon)&lt;br&gt;
sudo /usr/src/linux-headers-&lt;/code&gt;uname -r&lt;code&gt;/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vmnet)&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bu adımdan sonra ilgili sertifikanın "machine owner keys" içerisine eklenmesi için aşağıdaki komut uygulanır. Bu adımda girilen parola birazdan cihazı yeniden başlattıktan sonra BIOS üzerinden "Enroll with key" seçeneği ile kullanılacaktır.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
mokutil --import MOK.der&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Parola istenip, girildikten sonra bilgisayar yeniden başlatılır ve "Enroll with key" seçilerek girilen parola yazılır. Sonrasında cihaz yeniden başlatıldıktan sonra sanallaştırma ortamı kullanıma hazır olacaktır.&lt;/p&gt;

</description>
      <category>mok</category>
      <category>secureboot</category>
      <category>vmwareworkstation</category>
    </item>
    <item>
      <title>Ağ Sanallaştırma ve overlay protokoller</title>
      <dc:creator>Ali Orhun Akkirman</dc:creator>
      <pubDate>Mon, 08 Jan 2024 06:17:11 +0000</pubDate>
      <link>https://forem.com/aciklab/ag-sanallastirma-ve-overlay-protokoller-59db</link>
      <guid>https://forem.com/aciklab/ag-sanallastirma-ve-overlay-protokoller-59db</guid>
      <description>&lt;p&gt;Geleneksel bilgisayar ağları altyapısında ağ bölümleme (segmentasyon) için standart bir şekilde VLAN yani "Sanal Yerel Alan Ağı" kullanılmaktadır. İlgili yapı OSI 2. katmanda çalışmaktadır ve aslında ağ cihazlarındaki portlar vasıtasıyla, ağa bağlı cihazların mantıksal olarak gruplandırılmasını sağlar. VLAN'ın bir çok yararı olmasına rağmen yazımız için konumuz bu olmadığından dolayı bu detaylara girmeyeceğim. Sadece bu geleneksel mimariye "underlay network" denildiğini bilmemiz yeterli.&lt;/p&gt;

&lt;p&gt;"Overlay network" kavramı ise IP altyapısının hazır olduğu ve altyapıda yer alan underlay ağ'dan izole başka bir ağı temsil etmektedir.&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Overlay protokoller
&lt;/h1&gt;

&lt;p&gt;Overlay ağ üzerinde GRE, VXLAN ve GENEVE başta olmak üzere ortak olarak Katman 2 çerçevelerini Katman 3 IP paketleriyle birlikte kapsüllemesi ve taşınması işlevini oluşturmaktadır. Her ikisi de UDP protokolü ile veri taşımaktadır.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.a. GRE
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GRE&lt;/strong&gt; (Generic routing encapsulation), daha sonrasında bahsedeceğimiz VXLAN ve GENEVE'nin aksine ağ oluşturma işlevi için değil, IP ağı üzerinde tünelleme yapmak için kullanılmaktadır. Dolayısıyla noktadan noktaya tünelleme yapmaktadır. Diğer yöntemlerin aksine güvenli bağlantı sağlamak için VPN uygulamalarıyla birlikte kullanılması gerekmektedir. Dolayısıyla genel bir ağ sanallaştırması için tekil kullanılması uygun görülmeyecektir.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.b. VXLAN
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;VXLAN&lt;/strong&gt; (Virtual Extensible LAN), özellikle geniş bulut ortamlarındaki ağ altyapısının yönetilebilmesi için  VMware, Arista Networks ve Cisco firmalarının girişimleriyle oluşturulmuş bir standarttır. Tabi ki diğer bir çok üretici de bu standartı destekleyerek kullanım alanı oldukça genişlemiştir. VXLAN, VLAN kavramı ile aynı Katman 2 ağ hizmetlerini ağlamak için tasarlanmış olmasına karşın, genişletilebilir yapısı ile daha esnek bir çözüm sunmaktadır. En önemli çözümü VLAN yapısının 4096 bölümleme içermesine karşın VXLAN'ın 16 milyon bölümlemeyi desteklemesi olarak görülebilir.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.c. GENEVE
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GENEVE&lt;/strong&gt; (Generic Network Virtualization Encapsulation), ise VMware, Microsoft, Red Hat ve Intel başta olmak üzere yine standart bir şekilde VXLAN'ın bazı eksikliklerini kapatmaktadır. VXLAN'ın başlık (header) uzunluğu 8 Byte iken, GENEVE'de 16 Byte'a çıkmaktadır. Bu başlık verisinde özellikle "protokol identifier" verisi bulunduğu için çoğullama gibi bazı özellikleri kendi içerisinde çözümünü barındırabilmektedir. Ayrıca yine aktarım güvenliği, hizmet zinciri oluşturma ve bant içi telemetri özellikleri GENEVE'in artılarındandır. Bunlara ek olarak VXLAN içerisinde değişken olarak kullanılacak alanlar bulunmamasına karşın GENEVE bu yönden daha geniş veri sunabilmektedir.&lt;/p&gt;

&lt;h1&gt;
  
  
  2. Openstack Neutron
&lt;/h1&gt;

&lt;p&gt;Yukarıda bahsettiğimiz her 3 overlay protokolü de Openstack Neutron ile çalışmaktadır. &lt;/p&gt;

&lt;p&gt;Kaynak: &lt;a href="https://docs.openstack.org/neutron/rocky/admin/intro-overlay-protocols.html"&gt;https://docs.openstack.org/neutron/rocky/admin/intro-overlay-protocols.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vxlan</category>
      <category>geneve</category>
      <category>gre</category>
      <category>network</category>
    </item>
    <item>
      <title>Nexus OSS servisinin önüne nginx vekil servisi ekleme</title>
      <dc:creator>Ali Orhun Akkirman</dc:creator>
      <pubDate>Wed, 20 Dec 2023 09:02:54 +0000</pubDate>
      <link>https://forem.com/aciklab/nexus-oss-servisinin-onune-nginx-vekil-servisi-ekleme-5b29</link>
      <guid>https://forem.com/aciklab/nexus-oss-servisinin-onune-nginx-vekil-servisi-ekleme-5b29</guid>
      <description>&lt;p&gt;Ubuntu 22.04 üzerinde Nexus OSS kurulumu için aşağıdaki başlıkta kurulum görülebilmektedir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/aciklab/ubuntu-2204-nexus-oss-kurulumu-6gk"&gt;https://dev.to/aciklab/ubuntu-2204-nexus-oss-kurulumu-6gk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu adımdan sonra nexus servisinin kendisini dışarıya açmak verimli olmayabilir. Bu nedenle önüne nginx koymak daha sağlıklı olacaktır. &lt;/p&gt;

&lt;h1&gt;
  
  
  Nexus servisini yerele açma
&lt;/h1&gt;

&lt;p&gt;Nexus servisini sadece yerel makinede çalışacak hale getirmek için &lt;strong&gt;/opt/sonatype-work/nexus3/etc/nexus.properties&lt;/strong&gt; dosyası açılır ve içerisine aşağıdaki satır eklenir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;application-host=127.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Varsayılanda yoruma alınmış "0.0.0.0" ifadesi olduğu için uzak cihazdan da erişim sağlanmakta idi.&lt;/p&gt;

&lt;p&gt;Bu adımdan sonra nexus servisi aşağıdaki gibi yeniden başlatıldığında dışarıya kapatılmış olunur.&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="nb"&gt;sudo &lt;/span&gt;systemctl restart nexus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Ters vekil sunucusu olarak kullanma
&lt;/h1&gt;

&lt;p&gt;Bu adımdan sonra içeride hizmet veren nexus servisini dışarıya nginx servisi ile açabilmek için nginx paketini yüklemeniz gerekiyor.&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="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Site dosyası olarak &lt;strong&gt;/etc/nginx/sites-available/nexus&lt;/strong&gt; dosyası içerisine aşağıdaki gibi bir içerek eklemek gerekecektir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;upstream nexus3 {
  server 127.0.0.1:8081;
}

server {
    listen 80;

    location / {
        proxy_pass http://nexus3/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forward-Proto http;
        proxy_set_header X-Nginx-Proxy true;

        proxy_redirect off;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu sayede içeride 8081 portundan yayın yapan nexus servisi önüne 80 portu üzerinden &lt;strong&gt;nginx&lt;/strong&gt; yönlendirmesi eklenmiş olacaktır. Site ayarını aktife çekmek ve servisi yeniden başlatarak süreci bitirebiliriz.&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="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/nexus /etc/nginx/sites-enabled/
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu adımla birlikte 80 portu üzerinden uzaktan erişim sağlanmış olacaktır.&lt;/p&gt;

</description>
      <category>nexus</category>
      <category>nginx</category>
      <category>vekil</category>
      <category>proxy</category>
    </item>
    <item>
      <title>Liman MYS - Cihaz Yönetim Eklentisi ile Yazılım sürüm yönetimi</title>
      <dc:creator>Ali Orhun Akkirman</dc:creator>
      <pubDate>Tue, 29 Aug 2023 06:56:18 +0000</pubDate>
      <link>https://forem.com/liman/liman-mys-cihaz-yonetim-eklentisi-ile-yazilim-surum-yonetimi-f8k</link>
      <guid>https://forem.com/liman/liman-mys-cihaz-yonetim-eklentisi-ile-yazilim-surum-yonetimi-f8k</guid>
      <description>&lt;p&gt;HAVELSAN'ın geliştirdiği Liman MYS'nin kurumsal eklentilerinden olan Cihaz Yönetim Eklentisi ile Windows ve GNU/Linux sistemlere yüklediğiniz ajan ile sisteminizdeki tüm yazılımların sürüm bilgilerine göre listeleyebildiğiniz bir altyapıya sahip oluyorsunuz.&lt;/p&gt;

&lt;p&gt;Bu yapı özellikle kurumsal kullanımda oldukça önem taşımaktadır. Kurumsal kullanımda yaşanacak bir zaafiyet ve bu zaafiyetin çözümü için güncelleme işleminin yapılması sistem yönetimi tarafından izlenip, ya kendileri tarafından ya da cihazdan sorumlu olan tarafından çözülmesi beklenmektedir. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7sgoc3hk9k9p84h8pp97.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7sgoc3hk9k9p84h8pp97.png" alt="Image description" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Liman MYS'nin Cihaz Yönetimi Eklentisi ile kurumsal kullanımda bu soruna nasıl çözüm bulduğunu aşağıdaki şekilde görebiliriz. Ürünün ve Eklentinin tek yeteneğinin bu olmadığı, burada sadece temel seviyede cihazlar üzerindeki paketlerden bahsettiğimizi belirteceğim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flx97wc6koz9ycxmvf1ve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flx97wc6koz9ycxmvf1ve.png" alt="Image description" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu altyapı aslında makine kapalı bile olsa, tekil makine üzerinde de herhangi bir yazılımın sürümünün öğrenilmesinde kullanılabilmektedir. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0kcodqr0ksdo2m9jnczs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0kcodqr0ksdo2m9jnczs.png" alt="Image description" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3q1h8eosodi13dlnqks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3q1h8eosodi13dlnqks.png" alt="Image description" width="800" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Herhangi bir paketi tekil makine üzerinden güncelleyebilirsiniz. Fakat bu süreç tekil bir süreç olduğu için yönetilebilir olmayabilir. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge29dxcwyzamoh8twx5y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge29dxcwyzamoh8twx5y.png" alt="Image description" width="800" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Herhangi bir paketin, belirli sürümden başka bir sürüme geçişi için kaç makinenin etkilendiği yani bazı güncellemelerin makinelere teker teker veya "aksiyon" adını verdiğimiz yapı ile dağıtılmasını sağlayabilirsiniz. Tabi ki bu süreçler için sunucu ise sunucu sistemini bozmaması için sunucu sorumlusuyla iletişimde olmak oldukça önemli.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcc3squ0319pc5sjcpjov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcc3squ0319pc5sjcpjov.png" alt="Image description" width="800" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Windows sistemler üzerindeki güncellemelerden doğan KB (knowledge base) seviyesinde açıklanmış verileri tekil işlem olarak kontrol edebilirsiniz. Linux sistemlerde ise Ubuntu için &lt;a href="https://ubuntu.com/security/oval"&gt;Canonical'ın yayınladığı OVAL verileri&lt;/a&gt; üzerinden OpenSCAP'in taradığı şekilde listelenebilmektedir. Benzer şekilde OpenSCAP'in desteklediği &lt;a href="https://linux.oracle.com/security/"&gt;Oracle'ın yayınladığı OVAL açıklamaları&lt;/a&gt; OracleLinux işletim sistemi için de zaafiyetleri tarayabilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fosnqbnqrw6b4gwymxf3y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fosnqbnqrw6b4gwymxf3y.png" alt="Image description" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fef27qgdzr68mjlfddm1p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fef27qgdzr68mjlfddm1p.png" alt="Image description" width="800" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tüm bu zaafiyet ve içerikleri tek bir sayfada etkilediği makinelere göre de ayrıca görebilmektesiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fij4byay48c7ue1c4nzkg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fij4byay48c7ue1c4nzkg.png" alt="Image description" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Özetle HAVELSAN'ın geliştirdiği Liman MYS'nin kurumsal eklentilerinden Cihaz Yönetim Eklentisi ile bu ve bunun gibi bir çok yeteneğin bir kısmını anlatmak istedim. &lt;/p&gt;

</description>
      <category>liman</category>
      <category>paket</category>
      <category>cihaz</category>
      <category>yazilim</category>
    </item>
    <item>
      <title>Ubuntu 22.04 üzerinde belirli bir Helm sürümü kurulumu</title>
      <dc:creator>Ali Orhun Akkirman</dc:creator>
      <pubDate>Wed, 26 Jul 2023 08:52:31 +0000</pubDate>
      <link>https://forem.com/aciklab/ubuntu-2204-uzerinde-belirli-bir-helm-surumu-kurulumu-2jd2</link>
      <guid>https://forem.com/aciklab/ubuntu-2204-uzerinde-belirli-bir-helm-surumu-kurulumu-2jd2</guid>
      <description>&lt;p&gt;Helm, temel olarak Kubernetes üzerinde uygulamaları yönetmek için kullanılan uygulamadır. Kullanım açısından yetkisini "&lt;strong&gt;kubeconfig&lt;/strong&gt;" üzerinden almaktadır.&lt;/p&gt;

&lt;p&gt;Kurulumu için Ubuntu'da varsayılanda gelen snap paket yöneticisi ile kurulumu mümkün olduğu gibi, istenilen sürümde kurulumu için tar paketinden  kurulumunu göstereceğim.&lt;/p&gt;

&lt;h1&gt;
  
  
  Helm için sürüm belirleme
&lt;/h1&gt;

&lt;p&gt;Öncelikle istediğiniz sürümü Github üzerinde seçim yapabilirsiniz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/helm/helm/releases"&gt;https://github.com/helm/helm/releases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örneğin yazının yazıldığı tarihte güncel kararlı sürüm olarak v3.12.2, v3.11.3, v3.10.3, v3.9.4 ve v3.8.2 bulunmaktadır.&lt;/p&gt;

&lt;p&gt;Sonrasında istediğiniz sürüme göre wget komutu ile "tar.gz" dosyasını indirebilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://get.helm.sh/helm-v3.8.2-linux-amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  TAR dosyasından Helm kurulumu
&lt;/h1&gt;

&lt;p&gt;İndirilen tar.gz dosyası aşağıdaki komut ile açılır&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="nb"&gt;tar &lt;/span&gt;xvf helm-&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="nt"&gt;-linux-amd64&lt;/span&gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tar.gz içerisinden çıkan helm binary dosyası ekteki gibidir.&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="nb"&gt;sudo mv &lt;/span&gt;linux-amd64/helm /usr/local/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu adım sonrasında helm komutu direkt olarak kullanılabilir olacaktır. Versiyonu kontrol etmek için aşağıdaki komut çalıştırılabilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komutun çıktısı aşağıdaki gibi olmaktadır:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version.BuildInfo{Version:"v3.8.2", GitCommit:"6e3701edea09e5d55a8ca2aae03a68917630e91b", GitTreeState:"clean", GoVersion:"go1.17.5"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Helm sürümünün güncellenmesi
&lt;/h1&gt;

&lt;p&gt;Güncelleme yapılmak istendiğinde yeni binary tar dosyası indirilip, /usr/local/bin altına taşımak yeterli olacaktır. Dolayısıyla yukarıdaki adımları yapmak yeterlidir.&lt;/p&gt;

</description>
      <category>helm</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>KVM üzerinde NAT-ağı oluşturma</title>
      <dc:creator>Ali Orhun Akkirman</dc:creator>
      <pubDate>Mon, 10 Jul 2023 06:54:42 +0000</pubDate>
      <link>https://forem.com/aciklab/kvm-uzerinde-nat-agi-olusturma-3fob</link>
      <guid>https://forem.com/aciklab/kvm-uzerinde-nat-agi-olusturma-3fob</guid>
      <description>&lt;p&gt;KVM üzerinde farklı ağ yapıları üzerinde çalışmak için QEMU gibi arayüzler mevcut durumda yeterli olmamaktadır. Buna rağmen rahatlıkla XML formatında dosyalarla birlikte ağ ayarlarınızı yapabilirsiniz.&lt;/p&gt;

&lt;h1&gt;
  
  
  XML dosyasını oluşturma
&lt;/h1&gt;

&lt;p&gt;Kullanmak isteyeceğiniz NAT ağı için aşağıdaki gibi bir dosya oluşturmanız gerekiyor. Dosyaya istediğiniz bir ismi verebilirsiniz. Örneğin "orneknatagi.xml"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;network&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;YeniAgIsmi&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt; 
    &lt;span class="nt"&gt;&amp;lt;forward&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;'nat'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; 
        &lt;span class="nt"&gt;&amp;lt;nat&amp;gt;&lt;/span&gt; 
            &lt;span class="nt"&gt;&amp;lt;port&lt;/span&gt; &lt;span class="na"&gt;start=&lt;/span&gt;&lt;span class="s"&gt;'1024'&lt;/span&gt; &lt;span class="na"&gt;end=&lt;/span&gt;&lt;span class="s"&gt;'65535'&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt; 
        &lt;span class="nt"&gt;&amp;lt;/nat&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/forward&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;bridge&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;'default2'&lt;/span&gt; &lt;span class="na"&gt;stp=&lt;/span&gt;&lt;span class="s"&gt;'on'&lt;/span&gt; &lt;span class="na"&gt;delay=&lt;/span&gt;&lt;span class="s"&gt;'0'&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt; 
    &lt;span class="nt"&gt;&amp;lt;ip&lt;/span&gt; &lt;span class="na"&gt;address=&lt;/span&gt;&lt;span class="s"&gt;'192.168.X.1'&lt;/span&gt; &lt;span class="na"&gt;netmask=&lt;/span&gt;&lt;span class="s"&gt;'255.255.255.0'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; 
        &lt;span class="nt"&gt;&amp;lt;dhcp&amp;gt;&lt;/span&gt; 
            &lt;span class="nt"&gt;&amp;lt;range&lt;/span&gt; &lt;span class="na"&gt;start=&lt;/span&gt;&lt;span class="s"&gt;'192.168.X.2'&lt;/span&gt; &lt;span class="na"&gt;end=&lt;/span&gt;&lt;span class="s"&gt;'192.168.X.254'&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt; 
        &lt;span class="nt"&gt;&amp;lt;/dhcp&amp;gt;&lt;/span&gt; 
    &lt;span class="nt"&gt;&amp;lt;/ip&amp;gt;&lt;/span&gt;    
&lt;span class="nt"&gt;&amp;lt;/network&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu dosya içerisinde önemli olan 2 isim network ismi ve brige ismi olacaktır. Görünen isim için YeniAgIsmi yazan kısmı düzenlemelisiniz. &lt;/p&gt;

&lt;p&gt;Yine dosya içerisinde ip address, range start ve range end kısımlarındaki IP adreslerini istediğiniz gibi düzenlemelisiniz. Buradaki IP adresteki X yazan kısmı valid IP seviyesinde istediğiniz şekilde düzenlemeniz gerekmektedir.&lt;/p&gt;

&lt;h1&gt;
  
  
  NAT Ağı oluşturma
&lt;/h1&gt;

&lt;p&gt;XML dosyası istenildiği gibi düzenlendikten sonra aşağıdaki komut ile ağ oluşturulabilmektedir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;virsh net-create ~/orneknatagi.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu adımdan sonra aşağıdaki komutla yeni ağınızı görebilmektesiniz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;virsh net-list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; Name           State    Autostart   Persistent
-------------------------------------------------
 default        active   yes         yes
 YeniAgIsmi     active   no          no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Otomatik ağı başlatmak
&lt;/h1&gt;

&lt;p&gt;Bu adımda normalde "virsh net-autostart" komutu ile olması gerekirken aşağıdaki gibi bir hata verebilmektedir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error: Requested operation is not valid: cannot set autostart for transient network
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Çözüm için aşağıdaki komut ile ağın XML dosyası açılır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;virsh net-edit YeniAgIsmi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ve son satıra boşluk bırakılarak kaydedilir. Sonrasında ağın otomatik başlatılabilmesi için aşağıdaki komut kullanılabilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;virsh net-autostart YeniAgIsmi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>kvm</category>
      <category>nat</category>
      <category>network</category>
    </item>
  </channel>
</rss>
