CentOS7.7に Tracを導入したときのメモ

Trac関連

pipで全部入るので楽。ただ pipコマンドがデフォルトでは入っていなかったかも

pipのインストール方法 - Qiita

  sudo pip install Jinja2
  sudo pip install Trac
  sudo pip install babel
  sudo pip install Genshi

あと apacheと連携させるために mod_wsgiをインストールする。

  sudo yum install mod_wsgi

Trac環境用意

/var/www/trac 以下にTracのプロジェクトを置くことにする。

最初に実験用のプロジェクト SandboxProjectを作ってみる。

mkdir -p /var/www/trac
cd /var/www/trac
trac-admin SandboxProject initenv
chown -R apache.apache /var/www/trac

*1

run_trac.wsgi作成

/var/www/trac/run_trac.wsgiを作成

import os

os.environ['TRAC_ENV_PARENT_DIR'] = '/var/www/trac'
os.environ['PYTHON_EGG_CACHE'] = '/var/www/trac/eggs'

import trac.web.main
application = trac.web.main.dispatch_request

chownで apacheにしてパーミッションを 755に変更する。

chown apache.apache run_trac.wsgi
chmod 755 run_trac.wsgi

apache設定

/etc/httpd/conf.d/trac.confを作成

LoadModule wsgi_module modules/mod_wsgi.so

WSGIScriptAlias /trac /var/www/trac/run_trac.wsgi

<Directory /var/www/trac>
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
</Directory>

とりあえずこれで apacheを再起動すれば最低限は動く。

sudo service httpd restart

Tracに認証を追加

adminアカウントを用意する。

cd /var/www/trac/SandboxProject
htdigest -c .htdigest trac_user admin
<adminの新規パスワード>
cd /var/www/trac/SandboxProject
sudo -u apache trac-admin . permission add admin TRAC_ADMIN

/etc/httpd/conf.d/trac.conf に以下を追加して httpdを再起動

<Location "/trac/SandboxProject/login">
  AuthType Digest
  AuthUserFile /var/www/trac/SandboxProject/.htdigest
  AuthName "trac_user"
  require valid-user
</Location>

*1:initenvで svnリポジトリの場所を聞かれなくなっているが、後から設定できるのだろうか?

Swift4で Web APIから JSONデータをもらいオブジェクト化する

Random User Generator | HomeAPIを叩き、JSON形式で帰ってきたレスポンスを Swiftの構造体に収めるサンプル。 Playgroundで動作確認。

import Foundation

struct RandomUserResult : Codable {
    var results : [User]
    var info : Info

    struct User : Codable {
        var gender : String
        var name : Name
        var location : Location
        var email : String
        var login : Login
        var dob : Dob
        var registered : Registered
        var phone : String
        var cell : String
        var id : Id
        var picture : Picture
        var nat : String

        struct Name : Codable {
            var title : String
            var first : String
            var last : String
        }

        struct Location : Codable {
            var street : Street
            var city: String
            var state: String
            var country : String
            var postcode: Int
            var coordinates : Coordinates
            var timezone : Timezone

            struct Street : Codable {
                var number : Int
                var name : String
            }

            struct Coordinates : Codable {
                var latitude: String
                var longitude: String
            }

            struct Timezone : Codable {
                var offset: String
                var description: String
            }
        }


        struct Login : Codable {
            var uuid : String
            var username : String
            var password : String
            var salt : String
            var md5 : String
            var sha1 : String
            var sha256 : String
        }

        struct Dob : Codable {
            var date : String
            var age : Int
        }

        struct Registered : Codable {
            var date : String
            var age : Int
        }

        struct Id : Codable {
            var name : String
            var value : String
        }

        struct Picture : Codable {
            var large : String
            var medium : String
            var thumbnail : String
        }
    }
    
    struct Info :Codable {
        var seed : String
        var results: Int
        var page : Int
        var version : String
    }
}



let apiurl = URL(string: "https://randomuser.me/api/")!

var request = URLRequest(url: apiurl)
request.addValue("json", forHTTPHeaderField: "dataType")
URLSession.shared.dataTask(with: request) {data, response, err in
       if (err == nil) {
        print ("(゚∀゚) API通信成功")
        let jsonStr = String(data: data!, encoding: .utf8)!
        
        do {
            let result : RandomUserResult = try JSONDecoder().decode(RandomUserResult.self, from: jsonStr.data(using: .utf8)!)
            print (result)
        } catch {
            print (error.localizedDescription)
        }

       } else {
        print ("(´・ω・`) API通信失敗")
       }
       }.resume()

VPSを乗っ取られる

備忘録。

さくらのVPSの rootが取られた。 調べると /root以下に pythonの実行環境が置かれなにかスクリプトが動いており、 cronで定期的に情報を取得していた。

 

取り急ぎそれらのファイルをすべて消し、 $HOMEのバックアップを取る。といっても IRCのログくらいだが

その後OSをクリーンインストールし、 sshのポートを変更、認証方法の厳格化を行う。

以下のサイトが参考になった。

dogmap.jp

組み込みLinuxデバイスドライバの作り方

読みたい Qiita記事。9回目以降の内容が少し興味ある