PFSense Ghost Hot Spot Modülü Kurulumu ve İlk Ayarlar



  • Merhabalar ;

    Makeleyi buraya eklemem çok uzun zamanımı alacaktı. Aşağıdaki linkten ulaşabilirsiniz. Yarın'da PDF olarak ekleyeceğim. İyi günlerde kullanın.

    PFSense Ghost  Hot Spot Modülü Kurulumu ve Ayarları

    Merhaba Arkadaşlar, Bu makalemizde PFSense üzerinde Hot Spot hizmetinin nasıl verileceğini anlatacağım ve geliştirmiş olduğumuz Ghost Hot Spot modülünün PFSense sunucusuna nasıl kurulacağı hakkında teknik bilgiler aktarıyor olacağım.

    Ghost Freeradius’un veritabanına hükmeden PHP ile yazılmış basit ve geliştirilebilir bir scripttir. İstediğiniz gibi düzenleyebilir,Değiştirebilir hatta satabilirsiniz. Askere gideceğim için ekmeğini yemek bana nasip olmadı inşallah siz bu işten ekmek kazanırsınız.

    Ghost direk Freeradius ile entegre olarak çalıştığı için Firewall cihazınızın illa PFSense olması gerekmiyor. Freeradius kullanan herhangi bir firewall ile Ghostu sorunsuz çalıştırırsınız.

    Biz bu makalemizde PFSense üzerinde yapılandıracağımız için aşağıdaki konuları size anlatıyor olacağım.

    • MySQL Server Kurulumu
    • MySQL Veritabanı ve Kullanıcı Oluşturma İşlemleri
    • Php Componentleri Kurulumu ve Php.ini Ayarları
    • Ghost’un PfSense Public klasörüne kopyalanması ve Veritabanı Ayarları
    • Squid,Freeradius 2 Kurulumu ve Ayarları
    • Captive Portal Kurulumu ve Freeradius2 ile haberleşmesini sağlamak.
    • Freeradius2 ile MYSQL Sunucusunu haberleştirmek
    • Ghost İlk Ayarlar
    • Freeradius Attribute Mantığı

    Özellikler
    Karşılma Ekranı
    Dört adet Kimlik Doğrulama seçeneği

    • Tc kimlik doğrulamalı otomatik giriş sistemi.
    • Sms ile üyelik işlemi
    • Voucher kodu ile giriş
    • Normal giriş
    • Mobil Tasarım
      Yönetici Paneli Özellikleri
      Log Yönetimi
      Kullanıcı Giriş Logları
      Kullanıcı Detaylı Loglar (Upload,Download,Username,Password,Session Time,IP,MAC)
      Sms Logları (Username,Password,Telefon No,Gönderim Durumu (Başarılı,Başarısız)
      Kullanıcı Yönetimi
      Saatlik,Günlük,Haftalık,Sınırsız Kullanıcı Ekleyebilme,Silme,Düzenleme
      Online Kullanıcı Takibi
      Genel Ayarlar
      SMS Ayarları ve Şifre Limitleri
      Ghost şifre değiştirebilme

    http://sametyilmaz.com.tr/pfsense-ghost-hot-spot-kurulumu-ve-ilk-ayarlar.html





  • *** Arkadaşlar SQL içersinde SMS için gerekli ayarları bıraktım. Lütfen herkes SMS testini 2-3 testle bitirsin kuran arkadaşların hepsi test yapabilsin. Şuan 70'e yakın SMS bulunmaktadır.

    Eski sürüm PFSense sunucularda PHP Sürümü eski olabiliyor.Php sürümünü öğrenip SOAP paketini ona göre kurmalısınız.

    PHP 5.3.25 with Suhosin-Patch (cgi-fcgi) (built: May 30 2013 16:56:09)
    Copyright © 1997-2013 The PHP Group
    Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies
        with Suhosin v0.9.33, Copyright (c) 2007-2012, by SektionEins GmbH

    Yüklediğim SOAP Paketi : 5.3.10 : http://ftp-archive.freebsd.org/pub/FreeBSD/ports/i386/packages-8.3-release/All/php5-soap-5.3.10_1.tbz

    Soap paketini eğer PHP sürümüyle çok eski sürümünü yüklerseniz PFSense erişememe problemleri yaşabilirsiniz. Makale'de o sorunuda nasıl geçeceğinizi anlatıyor.



  • eline sağlık samet gayet güzel oldu

    bunun üstüne birşeyler eklemek bize kaldı artık :)



  • @hoscakal:

    eline sağlık samet gayet güzel oldu

    bunun üstüne birşeyler eklemek bize kaldı artık :)

    Teşekkürler abi. Kurulum yaptın mı ? Sıfır bir kurulum yapıp bir hata varsa bildirebilirmisin.



  • tamamdır deneyeyecem birazdan :)



  • Makeleyi PDF olarak ekleyecektim ama malesef boyutu yüksek olduğu için yüklemedi.

    PDF : www.sametyilmaz.com.tr/Ghost.pdf

    Yönetici Paneli : www.sametyilmaz.com.tr/ghost.tar

    Captive Portal : www.sametyilmaz.com.tr/portal.rar

    Özgür Abi ne durumdasın :)



  • samet kardeş kurulum yaptım emeginden dolayı tesekkür ederim.

    loglarla ilgili bir sıkıntı var sms ve tc kimlikte asagıdaki gibi log düşüyor yarın bir gün bu adam kim

    diye sorsalar yanıt vermek zor olacak bunun pratik bir cozumu varmıdır

    logportalauth[17272]: USER LOGIN: dLvZK, 18:20:00:00:00  , 172.16.1.7

    kullanıcıadı:dLvZK  gibi



  • Kullanıcı Adı ve Şifre sistem tarafından random oluşturuluyor.Bu logları 5651 olarak kullanmak için İmzalaması için bir yazılım entegre edilmesi gerekir veya veritabanındaki logların belirli aralıklarda samba veya buna benzer yöntemlerle bir başka sunucuya aktarımı yapılabilir

    Aslında geliştirmek istiyenler arkadaşlar için ben bir yol açtım 25 şubatta askere gideceğim içinde üzerinde çok fazla duramadım. Ama biri kalkıp Arama fonksiyonunuda entegre ederse dediğiniz gibi oluşan kullanıcıyı arama butonuyla aratıp kim olduğunu bulabilirsiniz.

    Lakin, burada şöyle bir detayda var. Eğer bir kullanıcı adıyla birkere kayıt girdikten sonra ve arkasından 1 kayıt daha girerseniz authentication sorunu yaşayacaksınız. Bu yüzden ben random oluşturttum.Burada şöyle birşey yapılabilir, kullanıcı üye olmaya çalıştığında veritabanında böyle bir kayıt var mı ? yok mu diye bir mantık geliştirir varsa TC kimlik numarasını kullanıcı adı yapıp yanına -1 ekler. Böylece bu sorunuda aşmış olursunuz.

    Ayrıca Kullanıcılar -> TC Kimlik Kullanıcıları bölümünden hangi tc ad soyad vs gibi ait olduğunu görebilirsiniz.

    Arama bölümünü eğer vaktim olursa haftasonu hallederim.Ghost.tar dosyasını güncellemenizi söylerim.



  • Öncelikle ellerinize sağlık gerçekten çok güzel çalışma olmuş.

    Yalnız benim bir sorunum oldu. Mysql'e root olarak bir türlü bağlanamıyorum.

    Anladığım kadarıyla deneyen arkadaşlar var, bu durumda benim yaptığım bir yanlış var ama bir türlü çözemedim. Şifreyi bile değiştirmeden yaptığımda problem oluyor.

    Sanırım resimde Pfsense'i yeniden başlatmamışım ama her halükarda hata veriyor.



  • MySQL Command bölümüne düşmek için aşağıdaki komutu kullanınız.Ama ilk kurulumu yaptıktan sonra sunucuyu yeniden başlatmanız gerekiyor. Bundan dolayı MySQL'e baglanamıyor olabilir veya root kullanıcısına şifre verirken bir hata olmuş olabilir.

    mysql -u root -p 
    

    Eğer yukarıdaki komutu koşturduktan sonra yine bağlantı sağlayamadıysanız aşağıdaki komutlarla mysql root şifresini sıfırlayıp tekrar deneyiniz.

    /usr/local/etc/rc.d/mysql-server.sh stop
    
    mysqld_safe --skip-grant-tables &
    
    mysql -u root
    

    MySQL Command ekranına safe moda düştüğünüzde aşağıdaki şekilde bir ekranla karşılasacaksınız.

    Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
    
    mysql>
    

    Sırasıyla aşağıdaki kodları koşturun.

    use mysql;
    

    Yeni_Sifre yazan bölüme root için yeni şifrenizi yazın.

    update user set password=PASSWORD("Yeni_Sifre") where User='root';
    
    flush privileges;
    
    quit
    

    Safe moddan çıkmak için MySQL Serveri stop edelim.

    /usr/local/etc/rc.d/mysql-server.sh stop
    

    Şimdi MySQL Server'i tekrar başlatalım.

    /usr/local/etc/rc.d/mysql-server.sh start
    

    MySQL Command ekranına düşmek için aşağıdaki komutu kullanıp Ghost için gerekli olan veritabanı ve kullanıcısını oluşturun

    mysql -u root -p 
    


  • Teşekkür ederim. Hemen deniyorum. Sonucu bildiririm. :)



  • Rica ederim beklemedeyim. Bu arada arama modülünüde ekliyorum gece onuda yayınlarım.



  • Söylediklerinizi aynen yaptım, gayet güzel bir şekilde çalışıyor. Ellerinize sağlık. Sistemime ekledim. Bugünden itibaren de aktif bir şekilde kullanacağım.  Tekrar teşekkür eder iyi akşamlar dilerim.



  • @aydemir_07:

    Söylediklerinizi aynen yaptım, gayet güzel bir şekilde çalışıyor. Ellerinize sağlık. Sistemime ekledim. Bugünden itibaren de aktif bir şekilde kullanacağım.  Tekrar teşekkür eder iyi akşamlar dilerim.

    Rica ederim. İyi günlerde kullanın. Bu gece Kullanıcı aramayla ilgili bir eklenti daha dahil edeceğim. Güncelleme için yüklemeniz gereken dosyaları buradan belirtirim.

    Kolay gelsin.



  • Sabırsızlıkla arama elentisini bekliyorum… :)



  • @hasanfatih:

    samet kardeş kurulum yaptım emeginden dolayı tesekkür ederim.

    loglarla ilgili bir sıkıntı var sms ve tc kimlikte asagıdaki gibi log düşüyor yarın bir gün bu adam kim

    diye sorsalar yanıt vermek zor olacak bunun pratik bir cozumu varmıdır

    logportalauth[17272]: USER LOGIN: dLvZK, 18:20:00:00:00  , 172.16.1.7

    kullanıcıadı:dLvZK  gibi

    Aşağıdaki komutlarla arama bölümünü sisteme entegre edebilirsiniz.

    @akula:

    Sabırsızlıkla arama elentisini bekliyorum… :)

    Çok bekletmeyelim o zaman :)

    Şuan yazacaklarım yeni kurulum yapacaklar için geçerli değildir. Yeni kurulum yapacak olan arkadaşlar, kurulumu tamamladıklarında zaten Arama bölümü aktif olarak gelecektir. Fakat bu post'tan önce kurulum yapan arkadaşlar aşağıdaki dosyaları ilgili dizine kopyalamaları gerekiyor.

    Putty SSH Client ile sunucunuza bağlanın.

    Ghost'un kurulu olduğu dizine gidin.

    cd /usr/local/www/ghost
    

    Guncellenen dosyaları indirin.

    fetch http://sametyilmaz.com.tr/ghostup.tar
    

    Dosyaları rar'dan çıkartın.

    tar xvzf ghostup.tar
    

    Ghost'a giriş yapın ve Kullanıcılar -> Kullanıcı Arama bölümünden kullanıcı ismini yazıp kullanıcı bilgilerini görebilirsiniz. Kullanıcı ismini tam olarak yazmanız gerekiyor.



  • Merhaba,

    Fatal error: Call to undefined function mysql_connect() in /usr/local/www/ghost/inc/db_settings.php on line 18

    Hatası alıyorum neden olabilir ?



  • @BetrayeR:

    Merhaba,

    Fatal error: Call to undefined function mysql_connect() in /usr/local/www/ghost/inc/db_settings.php on line 18

    Hatası alıyorum neden olabilir ?

    php.ini dosyasına mysql extension eklediniz mi ? MySQL fonksiyonu suan  sunucu uzerınde aktif olmadığı için bu hatayı verıyor.
    Php.ini dosyasını duzenleyın.

    nano /usr/local/lib/php.ini
    

    aşağıdaki extension ekleyin.

    extension=mysql.so
    

    aşağıdaki komutu koşturun ve pfsense yeniden başlatın.

    touch /etc/php_dynamodules/mysql
    


  • Bende tc kimlik modülü çalışmadı arkadaşlar.Yönetim panelinden girince ordan açtığım bi kullanıcı ile girebiliyorum ama tckimlik numarası ile giremiyorum.
    İyi çalışmalar



  • @cinlop:

    Bende tc kimlik modülü çalışmadı arkadaşlar.Yönetim panelinden girince ordan açtığım bi kullanıcı ile girebiliyorum ama tckimlik numarası ile giremiyorum.
    İyi çalışmalar

    Merhaba;

    PHP SOAP paketinde bir problem var büyük ihtimal. Ssh uzerinde pkg_info komutunu kosturup php soap paketinin kurulu olup olmadığına bakarmisiniz.



  • @sametyilmaznet:

    @cinlop:

    Bende tc kimlik modülü çalışmadı arkadaşlar.Yönetim panelinden girince ordan açtığım bi kullanıcı ile girebiliyorum ama tckimlik numarası ile giremiyorum.
    İyi çalışmalar

    Merhaba;

    PHP SOAP paketinde bir problem var büyük ihtimal. Ssh uzerinde pkg_info komutunu kosturup php soap paketinin kurulu olup olmadığına bakarmisiniz.

    php5-soap-5.3.10_1  The soap shared extension for php

    çalıştırdığım zaman yüklü olduğu görünüyor.Ama tckimlik ile girilmiyor.



  • eline sağlık arama bölümü gelmiş kullanıcı log larını nerede tutuyor var/log içindemi ?



  • @hasanfatih:

    eline sağlık arama bölümü gelmiş kullanıcı log larını nerede tutuyor var/log içindemi ?

    Merhaba

    Veritabanın'da radacct tablosunda tutmaktadır.Access loglarını ise postauth tablosunda tutuyor.



  • @cinlop:

    @sametyilmaznet:

    @cinlop:

    Bende tc kimlik modülü çalışmadı arkadaşlar.Yönetim panelinden girince ordan açtığım bi kullanıcı ile girebiliyorum ama tckimlik numarası ile giremiyorum.
    İyi çalışmalar

    Merhaba;

    PHP SOAP paketinde bir problem var büyük ihtimal. Ssh uzerinde pkg_info komutunu kosturup php soap paketinin kurulu olup olmadığına bakarmisiniz.

    php5-soap-5.3.10_1  The soap shared extension for php

    çalıştırdığım zaman yüklü olduğu görünüyor.Ama tckimlik ile girilmiyor.

    Bilgisayarınızda Ammy Admin açıp özel'den ID bilgisi verebilirmisiniz beraber bakalım. ?



  • @sametyilmaznet:

    @cinlop:

    @sametyilmaznet:

    @cinlop:

    Bende tc kimlik modülü çalışmadı arkadaşlar.Yönetim panelinden girince ordan açtığım bi kullanıcı ile girebiliyorum ama tckimlik numarası ile giremiyorum.
    İyi çalışmalar

    Merhaba;

    PHP SOAP paketinde bir problem var büyük ihtimal. Ssh uzerinde pkg_info komutunu kosturup php soap paketinin kurulu olup olmadığına bakarmisiniz.

    php5-soap-5.3.10_1  The soap shared extension for php

    çalıştırdığım zaman yüklü olduğu görünüyor.Ama tckimlik ile girilmiyor.

    Bilgisayarınızda Ammy Admin açıp özel'den ID bilgisi verebilirmisiniz beraber bakalım. ?

    Müsaitseniz çarşamba günü yapabilirmiyiz.Yarın diğer ofiste olacağım.
    İyi çalışmalar.



  • @cinlop:

    @sametyilmaznet:

    @cinlop:

    @sametyilmaznet:

    @cinlop:

    Bende tc kimlik modülü çalışmadı arkadaşlar.Yönetim panelinden girince ordan açtığım bi kullanıcı ile girebiliyorum ama tckimlik numarası ile giremiyorum.
    İyi çalışmalar

    Merhaba;

    PHP SOAP paketinde bir problem var büyük ihtimal. Ssh uzerinde pkg_info komutunu kosturup php soap paketinin kurulu olup olmadığına bakarmisiniz.

    php5-soap-5.3.10_1  The soap shared extension for php

    çalıştırdığım zaman yüklü olduğu görünüyor.Ama tckimlik ile girilmiyor.

    Bilgisayarınızda Ammy Admin açıp özel'den ID bilgisi verebilirmisiniz beraber bakalım. ?

    Müsaitseniz çarşamba günü yapabilirmiyiz.Yarın diğer ofiste olacağım.
    İyi çalışmalar.

    Benim için farketmez istediğiniz vakit yapabiliriz. Ama Soap paketi kurulduysa PFSense sunucuzunu yeniden başlatırsanız büyük ihtimal problemiz düzelmiş olur. Ama belki de başka bir problem olabilme ihtimali var, mesela captiveportal-islem.php ve captiveportal-tc.php dosyalarını yüklememiş olursanız giriş yapmaz. Ayrıca TC kimlik girişinde otomatik doğrulama sistemi çalışır eğer doğrulama yaparsan otomatik Login olunur.



  • Elinize Sağlık Böyle bir eklentiyi ücretsiz olarak paylaşarak foruma büyük bir katkıda bulundunuz.

    Çalışmada katkısı olan her arkadaşa tek tek teşekkür ederim.



  • @TechnicaL:

    Elinize Sağlık Böyle bir eklentiyi ücretsiz olarak paylaşarak foruma büyük bir katkıda bulundunuz.

    Çalışmada katkısı olan her arkadaşa tek tek teşekkür ederim.

    Evet, size aynen katılıyorum. Düşüncelerime tercüman oldunuz.



  • @TechnicaL:

    Elinize Sağlık Böyle bir eklentiyi ücretsiz olarak paylaşarak foruma büyük bir katkıda bulundunuz.

    Çalışmada katkısı olan her arkadaşa tek tek teşekkür ederim.

    Ben teşekkür ederim.Güle güle kullanın.@akula:

    @TechnicaL:

    Elinize Sağlık Böyle bir eklentiyi ücretsiz olarak paylaşarak foruma büyük bir katkıda bulundunuz.

    Çalışmada katkısı olan her arkadaşa tek tek teşekkür ederim.

    Evet, size aynen katılıyorum. Düşüncelerime tercüman oldunuz.

    Teşekkürler, İyi günlerde kullanın arkadaşlar.



  • Öncelikle Çok teşekkürler.
    Gerçekten süper olmuş.Emeklerine sağlık
    TC no ile login olma sıkıntısını bende yaşamaktayım
    DB ye TC numarası gelmekte fakat login olmamakta.
    Bu konuda Cinlop arkadaşımızın yaşadığı sıkıntıyı 1e1 yaşamaktayım
    Aklıma sadece fikir olarak geldi.Acaba Pfsense 'nin hangi version'unda bu sorunu yaşamaktayızAcaba 2.1 değil de 2.0.1 versiyon mu kullanmalıyız?
    Siz hangi versiyonu tavsiye edersiniz….

    Saygılar..



  • @operatortt:

    Öncelikle Çok teşekkürler.
    Gerçekten süper olmuş.Emeklerine sağlık
    TC no ile login olma sıkıntısını bende yaşamaktayım
    DB ye TC numarası gelmekte fakat login olmamakta.
    Bu konuda Cinlop arkadaşımızın yaşadığı sıkıntıyı 1e1 yaşamaktayım
    Aklıma sadece fikir olarak geldi.Acaba Pfsense 'nin hangi version'unda bu sorunu yaşamaktayızAcaba 2.1 değil de 2.0.1 versiyon mu kullanmalıyız?
    Siz hangi versiyonu tavsiye edersiniz….

    Saygılar..

    Merhabalar ;

    Bugün bende bir arkadaşımın restround'a kurulum yaptım.Jquery ile ilgili bir problem oluşmuş düzeltip portal.rar dosyasını tekrar yükleyeceğim.Buradan portal.rar dosyasının linkini vericem captiveportal ve filemanager'dan yüklemeleri tekrar yapmanız gerekecek.

    Ghost sürüm bağımsız çalışır.Önemli olan MySQL Server ve Soap repolarını doğru bulmak ve yüklemek.



  • @sametyilmaznet:

    @operatortt:

    Öncelikle Çok teşekkürler.
    Gerçekten süper olmuş.Emeklerine sağlık
    TC no ile login olma sıkıntısını bende yaşamaktayım
    DB ye TC numarası gelmekte fakat login olmamakta.
    Bu konuda Cinlop arkadaşımızın yaşadığı sıkıntıyı 1e1 yaşamaktayım
    Aklıma sadece fikir olarak geldi.Acaba Pfsense 'nin hangi version'unda bu sorunu yaşamaktayızAcaba 2.1 değil de 2.0.1 versiyon mu kullanmalıyız?
    Siz hangi versiyonu tavsiye edersiniz….

    Saygılar..

    Merhabalar ;

    Bugün bende bir arkadaşımın restround'a kurulum yaptım.Jquery ile ilgili bir problem oluşmuş düzeltip portal.rar dosyasını tekrar yükleyeceğim.Buradan portal.rar dosyasının linkini vericem captiveportal ve filemanager'dan yüklemeleri tekrar yapmanız gerekecek.

    Ghost sürüm bağımsız çalışır.Önemli olan MySQL Server ve Soap repolarını doğru bulmak ve yüklemek.

    Çok Teşekkürler.



  • Merhaba.

    Sana nasil ve ne kadar tesekkur edecegimi bilemiyorum. Emegine saglik. Allah hayirlisiyla vatani gorevini yerine getirmeyi nasip etsin.

    Saygilarimla.



  • @Qbilay:

    Merhaba.

    Sana nasil ve ne kadar tesekkur edecegimi bilemiyorum. Emegine saglik. Allah hayirlisiyla vatani gorevini yerine getirmeyi nasip etsin.

    Saygilarimla.

    Güzel dilekleriniz için teşekkür ederim @qbilay , Güle güle kullanın inşallah, hayırlısıyla gidip geleceğiz bakalım : ))



  • elinize saglık;

    dosya güncellendimi acaba bendede aynı hatayı verdi.



  • @ondokuz:

    elinize saglık;

    dosya güncellendimi acaba bendede aynı hatayı verdi.

    Sanırım daha güncelleme gelmedi.Dört Gözle beklemekteyiz



  • @operatortt:

    @ondokuz:

    elinize saglık;

    dosya güncellendimi acaba bendede aynı hatayı verdi.

    Sanırım daha güncelleme gelmedi.Dört Gözle beklemekteyiz

    Karşılama ekranını tekrar elden geçirdim. 2-3 saatimi aldı daha stabil hale getirdim birazda temizlik yaptım. Gecikme için kusura bakmayın, malüm aynı zamanda askere gideceğim için elimde eksik ve yarım kalan işleri tamamlamaya çalışıyorum.Anlayışla karşılayacağınızı umuyorum, Allah'a emanetsiniz.

    Services -> CaptivePortal -> Filemanager - Bulunan bütün eski dosyaları sırasıyla temizleyin.

    Aşağıdaki rar dosyasını bilgisayarınıza indirin ve rar'dan çıkartın.

    http://www.sametyilmaz.com.tr/portal.rar dosyasını indirin.

    Portal Page Contents bölümünden index.html dosyasını yükleyin.

    Authentication error page contents : hata.html dosyasını yükleyin.

    CaptivePortal -> Filemanager -> İndirmiş olduğunuz rar dosyasının içersindeki index.html ve hata.html hariç bütün dosyaların yüklemesini tamamlayın.

    Kolay gelsin.



  • Eline sağlık, çoğu fikri zikri ufak tefek eklentileri eklemek istiyenler için 10 numara 5 yıldız olmuş.
    Adamın dibisin mesleğinde zirvedesin =)))



  • @Eniqma27:

    Eline sağlık, çoğu fikri zikri ufak tefek eklentileri eklemek istiyenler için 10 numara 5 yıldız olmuş.
    Adamın dibisin mesleğinde zirvedesin =)))

    Teşekkür ederim :)))



  • genel ayarlar bölümünde
    şifre geçerlilik süresi  hem tc hemde sms içinmi gererlidir.


Log in to reply