PHP SSH2 Kütüphanesi

PHP ile linux server tarafında başka bir linux server a bağlanıp işlem yapmanız gerekiyor ise SSH2 eklentisi tam olarak size göre. Birçok servisimizde ve projemizde kullanmış olduğumuz SSH2 eklentisine ufak bir kütüphane yazdım.

SSH2 kütüphanesini kullanabilmek için kullanmış olduğunuz Linux dağıtımına göre kütüphaneyi kurmanız gerekiyor. Centos 7 için kullanmış olduğum kaynak : https://www.adveyer.com/blog/centos-7-ssh2-php-extension-kurulumu/ Okumaya devam et “PHP SSH2 Kütüphanesi”

JQuery ile Nesnenin Show / Hide Event Yakalama

Javascript tarafında oldukça fazla event ( olay ) var. JQuery ile birleştiğinde daha da fazla eventlara hatta özelleştirilmişlere dahi sahip olabiliyorsunuz. Bir projede form hazırlarken div nesnesinin show / hide durumuna göre başka bir nesnenin işlenmesi gerekiyordu. Ufak bir araştırma sonucu herhangi bir nesnenin – sadece div değil – show / hide durumlarına göre event atayabileceğimi buldum.

Aşağıdaki kod ile bu event ın tanımlamasını yapıyoruz

( function( $ )
{
  $.each(['show', 'hide'], function (i, ev)
  {
var el = $.fn[ ev ];
$.fn[ ev ] = function()
{
  this.trigger( ev );
  return el.apply( this, arguments );
};
  });
})(jQuery);

Örnek kullanım;

$( 'div' ).on( 'show', function()
{
$( 'span' ).html( 'div gösterim durumu açık' );
});
$( 'div' ).on( 'hide', function()
{
$( 'span' ).html( 'div gösterim durumu kapalı' );
});

Siz div veya kendi class / id her neyse artık $( ‘div’ ).show(); veya $( ‘div’ ).hide(); yaptığınızda span nesnesi içerisinde durumunu açıklayan yazıyı yazacak. Bu ihtiyaç bizim için sekmeli form işlemi yaparken verilen cevaplara göre bir sonraki sorunun ( her bir soru bir div içerisinde yapı olarak yer alıyor )  hangisi olacağını belirliyordu. Basit bir işlem için bu şekilde bir kullanıma gerek kalmayabilir fakat hareket güzel. 🙂

Denemedim fakat event ataması yapılırken each ile birlikte show / hide belirteci yapılırken farklı eventlar üzerinden event türetimi yapılabilir sanırım.

Kaç Satır Kod Yazdığınızı Merak Ediyorsanız ?

Projelerinizde kaç satır kod yazdığınızı merak ediyorsanız ki ben etmiştim onun aşağıdaki ufak projeyi yazdım ( Kopyala + Yapıştır > Sonuç : ). Google üzerindeki araştırmalar sonucu bir klasör içerisindeki dosyaların Boyutlarını, Satır sayılarını, Karakter ve Kelime sayılarını basit bir şekilde ekrana döktüm.

 

Siz isterseniz birden fazla klasör seçimi de yapabilirsiniz. Proje örnek kodları ve projenin kaynak kodları aşağıda yer almaktadır. Proje C#.NET tabanlıdır. Neden diye sormayın en hızlı bununla çıkartabildim 🙂 Daha farklı yöntemler olabilir. Linç etmeyin 🙂

Form üzerinden seçilen klasörün içerisindeki dosyaları tek tek okuyup dosya yolu ile  birlikte datagrid nesnesine ekliyor.

            if (!Directory.Exists(@"" + textBox1.Text))
                return;
            dataGridView1.Rows.Clear();

            DirectoryInfo di = new DirectoryInfo(@""+textBox1.Text);
            FileInfo[] directories = null;
            try
            {
                // tüm klasörler içerisindeki hangi dosyaların hesaplanacağı -- hepsi seçildi.
                directories = di.GetFiles("*", SearchOption.AllDirectories); 
            }
            catch
            {

            }
            Int64 total = 0;
            foreach (var item in directories)
            {
                string FilePath = @"" + item.DirectoryName + "\\" + item.Name;
                var lineCount = File.ReadLines(FilePath).Count(); // satır sayısı
                Int64 WordsCount = 0; // kelime sayısı
                Int64 CharCount = 0; // karakter sayısı
                
                // dosyayı parçalara ayırıp kaç satır ve karakter olduğunu hesaplayacağız.
                string FileText = new System.IO.StreamReader(FilePath).ReadToEnd().Replace("\r\n", "\r");
                CharCount = FileText.Length;
                WordsCount = FileText.Split(' ').Length;
                // datagrid üzerine topladığımız bilgileri aktarıyoruz. BoyutHesapla fonksiyonu ile dosya boyutu hesaplanıyor ( b, kb, mb, gb vs )
                dataGridView1.Rows.Add(item.Name, item.DirectoryName.ToString().Replace(textBox1.Text, ""), BoyutHesapla( item.Length ), item.Length, lineCount, CharCount, WordsCount);
                total += item.Length;
            }
            label2.Text = ( dataGridView1.Rows.Count - 1 ).ToString();
            label4.Text = BoyutHesapla( total)+" ( "+total+" ) "; // toplam boyutu hesaplaıyoruz..

Yukarıdaki kodda yer alan BoyutHesapla fonksiyonu ise gelen boyutları byte, kilobyte, megabyte vb. cinsinden çevrilmesini sağllıyor.

        public static string BoyutHesapla(long gelenboyut)
        {
            if (gelenboyut >= 1073741824)
                return (gelenboyut / 1073741824) + " GB ";
            if (gelenboyut >= 1048576)
                return (gelenboyut / 1048576) + " MB ";
            if (gelenboyut >= 1024)
                return (gelenboyut / 1024) + " KB ";
            return gelenboyut + " B ";
        }

Proje Dosyalarını Buradan İndirebilirsiniz..

Centos 7 Güncelleme Sırasında İstenmeyen Güncellemeler

Konu başlığı biraz yanlış olmuş olabilir. Şöyle anlatayım; Sanallaştırma ile Linux dağıtımlarından Centos 7 kullanıyoruz. Sunucuya güncelleme geldiği için güncelleyelim dedik fakat öncesinde vmware üzerinden snapshot aldığımız iyi olmuş. Çünkü centos üzerinde freeradius 3.0.4 kullanıyorduk. Repo olarak yüklenmışti. Güncelleme sonrası tabi freeradius da güncellendi. Ne mi oldu ? Neler olmadı ki.. Özelleştirilmiş freeradiusumuz patladı. Patladığı gibi adamlar o kadar güzel değişiklikler yapmışlar ki anlatamam. Sizinde anlayacağınız gibi dağıldık. Neyse ki yedeğimize yani snapshot yedeğimize güvenip hemen geri döndük. Okumaya devam et “Centos 7 Güncelleme Sırasında İstenmeyen Güncellemeler”

Windows ile Web Yedeklemesi Yapmak ve FTP

Bir önceki yazımda Centos Linux MYSQL ve Web Dosyaları Yedekleme işlemlerinden örnek vermiştim. Bu yazımda ise Windows bir sunucu üzerinde web dosyalarımızı nasıl yedekleriz ve FTP olarak farklı bir yedekleme alanına taşımayı örnekleyeceğim. Bu sefer MYSQL yok fakat siz yaparsınız bence 🙂

Yedekleme için önce Windows daki Winrar uygulamasını kullanıp dosyalarımızı sıkıştırıyoruz. Sonrasında ise NCFTP eklentisiyle beraber dosyalarımızı FTP alanımıza taşıyoruz. Windows daki FTP de problem yaşadığım için NCFTP kullanıyorum. Siz farklı FTP çözümleri de kullanabilirsiniz.

@echo off
set path="C:\Program Files\WinRAR\";%path%

# rar.exe yi çalıştırıp yedekleme yapacağımız dosyalarımızı sıkıştırıyoruz.
rar.exe a -r C:\BACKUP\YEDEK-%DATE%.rar C:\wwwroot

# İsterseniz sıkıştırma sırasında istenmeyen dosya uzantılarını belirtebilirsiniz.
# rar.exe a -r -x*.jpg -x*.jpeg -x*.pdf -x*.png -x*.log -x*.rar -x*.ttf -x*.otf -x*.dat C:\BACKUP\YEDEK-%DATE%.rar C:\wwwroot

# NcFTP programı ile birlikte dosyalarımızı FTP yedekleme alanımıza yüklüyoruz..
ncftpput -C -u FTP_KULLANICI_ADI -p FTP_KULLANICI_SIFRESI FTP_ADRESI C:\BACKUP\YEDEK-%DATE%.rar /FTP_DOSYA_YOLU/YEDEK-%DATE%.rar

# Yedek dosyasını siliyoruz.. Bu isteğe bağlıdır. İsterseniz silmeyebilirsiniz.
DEL /F /S /Q /AA C:\BACKUP\YEDEK-%DATE%.rar

Yukarıdaki kod parçasını Windows üzerinde .bat olarak kaydetmeniz gerekir. İsterseniz daha farklı yöntemler kullanıp yedekleme yaptırabilirsiniz. Örnek olarak C#.NET biliyorsanız küçük bir .exe ile de bu işi çözümleyebilirsiniz. Tabi bir de bu küçük kod parçalarını sürekli olarak çalıştırmanız gerekli. Bazı geliştiriciler gördüm her gün kendileri çift tık yapıp yedek almasını bekleyenler var. Fakat önerim Windows Zamanlanmış Görevleri ( Task Scheduler ) kullanmanız daha sağlıklı olacaktır.

Sıkıştırma yaparken neden istenmeyen dosyaları alalım gibi bir düşünce oluşuyorsa kafanız da şöyle bir örnek verebilirim.

Bir projemizde canlı sistem üzerinde geliştirme yaparken yazılım tarafının yedeklerini manuel olarak almak yerine şöyle bir yol izledik. Her gün .jpg, .jpeg, .pdf, .png, .log vs. dosyalarını yedeklemek yerine ( yedekleme diskininin kapasitesini çok fazla kullanıyordu ) bu dosyalar haricindeki dosyaları yedekledik. Bunu isterseniz günlükten saatliğe çekebilirsiniz.

Sonrasında her hafta sonu da haftalık tam yedek yani bütün dosyaları sıkıştırıp yedekleme işlemi yaptık.  Böylece günlük yedeklerin boyutları ile haftalık yedeklerin boyutları birbirinden farklı oldu. Yedekleme diskimiz ne çok fazla tuttu nede zaman kaybı yaşadık.

 

Centos Linux MYSQL ve Web Dosyaları Yedekleme

VPS ( Virtual Private Server | Özel Sanal Sunucu ) kullanıyorsanız üzerinde de Cpanel, WHM, Vesta, Plesk vb. bir yönetim paneli bulunmuyor ise yedekleme işlemleri biraz zor olabilir. Yedekleme yapabilmek için genellikle manuel işlemler mevcut. MYSQL kullandığımızı düşünürsek PHPMyAdmin üzerinden tüm veritabanını indirmek, PHP kullandığımızı da düşünürsek FTP vb. bir bağlantı ile bağlanıp dosyaları maneul olarak yedeklemek uzun bir senaryo.

Peki biz her gece uyurken yedekler otomatik olarak alınsa ? Daha rahat ve güzel olmaz mı ? 🙂 Okumaya devam et “Centos Linux MYSQL ve Web Dosyaları Yedekleme”

Mikrotik C# API Get Parse

Ufak bir proje için Mikrotik Firewall cihazlarından bilgileri çekmek için wiki.mikrotik.com tarafından hazır sınıfı ( Class ) kullanıyoruz.

Bu işlemleri hızlandırmak adına ufak bir Dictionary geri döndüren parse fonksiyonu hazırladık. Dışarıdan gönderilen MK class ı ile mik nesnesini otomatik olarak okuyup parçaladıktan sonra veriyi geriye dizi olarak döndürüyoruz. Bu diziyi örnekleyecek olursak bir tablo gibi geriye dönüyor. Satırlardan oluşuyor. Sütunlar için ise KEY -> VALUE şeklinde yapılanma mevcuttur.

public static Dictionary<int, Dictionary<string, string>> get_parse(MK mik)
{
Dictionary<int, Dictionary<string, string>> temp = new Dictionary<int, Dictionary<string, string>>();
int i = 0;
foreach (var item in mik.Read())
{
Dictionary<string, string> asd = new Dictionary<string, string>();
string[] tmp = item.Split('=');
for (int k = 0; k < tmp.Length; k += 2)
asd.Add(tmp[k], tmp[k + 1]);
temp[i] = asd;
i++;
}
temp.Remove(i - 1);
return temp;
}

MYSQL Ufak İpuçları – vol.4

Dördüncü seri olarak birkaç ip ucu ile devam edelim.
Birinci seri için BURADAN ulaşabilirsiniz.
İkinci seri içi BURADAN ulaşabilirsiniz.
Üçüncü seri için BURADAN ulaşabilirsiniz.

Değişik MYSQL ip uçları ve sorguları yazmak hoşunuza gidiyor ise seriyi takip etmenizi öneririm. Çok fazla değişik sayılmazlar, Google’da arama yaparsanız mutlaka karşınıza çıkacaktır.

MYSQL Veritabanımızda hangi tabloda kaç sütun / kolon olduğunu merak ediyorsak ( bunu niye merak ettiysek 😀 ) aşağıdaki komut işimizi görecektir.

SELECT TABLE_NAME TABLO_ADI, Count(*) SUTUN_SAYISI
FROM information_schema.`COLUMNS`
WHERE table_schema = 'VERI_TABANI_ADI'
GROUP BY TABLE_NAME
ORDER BY SUTUN_SAYISI DESC

Bu sorgunun nerede işe yaracağını düşünüyorsanız geliştirmekte olduğunuz sistemde normalizasyon yapmak istediğinize birkaç analiz yapmanız gerekebilir. Bu sorgu onlardan biri.

MYSQL serisi diyip durduk araya biraz MSSQL de serpiştirelim;

MSSQL de Veritabanımızda kaç adet satır var ? :

SELECT sc.name +'.'+ ta.name TABLO_ADI, SUM(pa.rows) SATIR_SAYISI
FROM sys.tables ta
INNER JOIN sys.partitions pa
ON pa.OBJECT_ID = ta.OBJECT_ID
INNER JOIN sys.schemas sc
ON ta.schema_id = sc.schema_id
WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0)
GROUP BY sc.name,ta.name
ORDER BY SUM(pa.rows) DESC

 

MSSQL de veritabanımızda toplam kaç adet satır var dersek de tabi ki yukarıdaki sorguyu biraz değiştirip tekrar sorgulatıyoruz 🙂

SELECT SUM(pa.rows) TOPLAM_SATIR
FROM sys.tables ta
INNER JOIN sys.partitions pa
ON pa.OBJECT_ID = ta.OBJECT_ID
INNER JOIN sys.schemas sc
ON ta.schema_id = sc.schema_id
WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0)
ORDER BY SUM(pa.rows) DESC

 

Bu seriyi daha fazla uzatmadan 2 buçuk örnekle bırakıyorum 🙂

MYSQL Ufak İpuçları – vol.3

Üçüncü seri olarak birkaç ip ucu ile devam edelim.
Birinci seri için BURADAN ulaşabilirsiniz.
İkinci seri içi BURADAN ulaşabilirsiniz.

Nasipse 4. seriyi de yayınlarım yakın bir zamanda 🙂

İlk olarak şöyle bir yapalım. Bir tablomuz var ve diğer bir tabloya aktaracağız. Arayüz kullanırken bu işlemler bir kaç tık yaparak sonuca hızlıca ulaşabiliriz fakat ya arayüzümüz yoksa. ! Çözüm tabi ki var. Komut satırından devam. Arayüz ne yapıyor sanıyorsunuz 🙂

Örnek olarak eski kullanıcı tablosundaki belirli bir sorgunun cevabını yeni bir tabloya aktarmamız gerekiyor;
# INSERT INTO YENI_KULLANICI_TABLOSU ( ADI,SOYADI,MESLEK, ESKI_ID,EMAIL, ADRES ) SELECT ADI,SOYADI,MESLEK, ESKI_ID,EMAIL, ADRES FROM ESKI_KULLANICI_TABLOSU WHERE YAS > 23 AND KAYIT_TARIHI > ‘2018-01-01’  ORDER BY ID DESC LIMIT 1000

Where şartımıza göre yukarıdaki sorgumuz ESKI_KULLANICI_TABLOSU‘dan  YENI_KULLANICI_TABLOSU‘na aktarım yapacaktır. Bu işlemi bir yazılım dili ile de yapabiliriz. Fakat şöyle düşünün; Önce yazılımın çalışacağı PLATFORM’a tüm bilgiyi çekeceğiz ve sonra tekrar geriye INSERT edeceğiz. Bu şekilde daha hızlı olmasını sağlayabilirsiniz. Tabi ki bir veritabanından farklı bir veritabanına aktarım yapmak isterseniz bu sorgu biraz yetersiz gelebilir. 🙂 O zaman kolları sıvayıp bir aktarım / transfer mekanizması yazmanız gerekebilir.

Veritabanınızdaki toplam satır sayısını merak ediyorsanız aşağıdaki sorguyu kullanabilirsiniz.
# SELECT SUM( TABLE_ROWS )
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = ‘VERI_TABANI_ADI‘;

Yine bir merak sorusu ile devam edelim. Merak ettiğimiz ise veritabanımızdaki tabloların MB ( megabayt ) cinsinden boyutlarını sorgulayalım.
# SELECT
table_schema as `Database`,
table_name AS `Table`,
round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
FROM information_schema.TABLES
ORDER BY (data_length + index_length) DESC;

Bu sorgular sürekli kullanılan sorgular değildir. Genellikle kriz anlarında yani veritabanı çökmeye yakın anlarında hangi tablo çatlamış, hangi tablo diskte fazla yer kaplıyor, hangi tablo neden bu kadar şişmiş durumlarını kontrol edebilmek içindir. Sorguları genişletip daha farklı sonuçlar alabilirsiniz ve geleceğinizi yakından görüp kriz anlarını öncesinde çözebilirsiniz.

Bir sonraki seride görüşmek üzere. 🙂

 

MYSQL Ufak İpuçları – vol.2

İkinci seri olarak birkaç ip ucu ile devam edelim.
Birinci seri için BURADAN ulaşabilirsiniz.

  • Eski bir tabloda otomatik ID yok ise aşağıdaki komut ile ekleyebilirsiniz;
    • ALTER TABLE `TABLO_ADI` ADD `SUTUN_ADI` INT NOT NULL AUTO_INCREMENT AFTER `HANGI_SUTUNDAN_SONRA`, ADD PRIMARY KEY (`SUTUN_ADI`);
  • Var olan bir Mysql kullanıcısı şifre değiştirme;
    • UPDATE SET USER PASSWORD=PASSWORD(‘YENI_SIFRE‘) WHERE USER=’KULLANICI_ADI‘;
      FLUSH PRIVILEGES;
    • Yetki durumuna göre de şifre değiştirme işlemi yapabilirsiniz;
      • GRAN ALL PRIVILEGES ON DATABASEADI.* TO ‘KULLANICI_ADI‘@’SOURCE_IP‘ IDENTIFIED BY ‘YENI_SIFRE’ with GRANT OPTION;
      • Source IP / Kaynak IP olarak kullanıcı hangi IP den izinli olup olmadığını belirtebilirsiniz. Her yerden bağlanmasını isterseniz “%” ( Yüzde ) işareti koymanız gerekir.

Ek olarak Centos 7 üzerinde MYSQL portuna firewall tarafından izin vermeyi de ekliyorum. Belki lazım olur 🙂

Her yerden izin vermek istediğimizde;
# firewall-cmd –permanent –add-port=3306/tcp
Bu komutun aynısı farklı port açma işlemlerinde de kullanabilirsiniz. Örn : http : 80, https : 443,  ftp : 21, ssh : 22, telnet : 23, dns : 53, ntp : 123 vb.

Özel IP adreslerine izin vermek istediğimizde;
firewall-cmd –permanent –zone=public –add-rich-rule=’ rule family=”ipv4″ source address=”KAYNAK_IP” service name=”mysql” accept’

Bu komuttan sonra işe yaraması için firewall-cmd –reload yapmanız veya servisi tekrar başlatmanız önerilir. En kötü sunucuyu yeniden başlatın 🙂

Yukarıdaki örnekler basit örneklerdir. Fakat sunucu ve arka plan işlemleri ile uğraşanların hemen hemen her konfigürasyonunda kullanmış oldukları, ihtiyaç doğrultusunda keep.google.com gibi yerlerde hızlı ulaşabilmek için saklıyorlardır. En azından ben o şekilde saklıyorum 🙂