差分

ナビゲーションに移動 検索に移動
色々事情がありまして…Dropboxを動作させるユーザーIDとSambaで共有するためのユーザーIDは同一のものにしようとしています。<br/>また、PC(Windows10)及びRaspbianと共有することが前提となっています。<br/>そこらあたり前提の手順となっておりますが、ご了承ください。久しぶりにやったら、すっかり忘れていたので覚書…
= Sambaのインストール = C++のDLLプロジェクト作成 ==以下のコマンドを実行して、Sambaをインストールします。まず、C++のDLLを作成するときの注意点…作成するプロジェクトは、「Win32プロジェクト」を選択するんだ。<syntaxhighlight lang="bash"br/>pacman [[ファイル:CShapeToCppDll-S samba</syntaxhighlight>005.jpg]]
上記でインストールしても設定ファイルが作成されないようです…。あと…アプリケーションの設定では「DLL」と「空のプロジェクト」を選択してね。<br/>なので、下記コマンドで設定ファイル「smb.conf」をダウンロードします。<syntaxhighlight lang="bash">wget "https[[ファイル://git.samba.org/samba.git/?p=samba.git;a=blob_plain;f=examples/smb.conf.default;hb=HEAD" CShapeToCppDll-O /etc/samba/smb001.confjpg]]<br/syntaxhighlight>※wgetがインストールされていない場合は「pacman -S wget」でインストールしてください。
= 設定 =
ここからが難題です…。<br/>
Sambaですが汎用性が高いからか、設定が非常に煩雑?です…。<br/>
細かいところまで手が届くと言えばそうなのですが…家で適当に使用するにはオーバースペックな感じを受けます…。<br/>
そこで、できるだけ最小限の設定を目指します。空のプロジェクトが作成されたら「cpp」「h」「def」ファイルを追加するんだ。今回は「CppDll.cpp」「CppDll.h」「CppDll.def」を追加したよ。
「nano」等のエディタで「/etc/samba/smb.conf」を開きます。
== ログの出力先 ==そしたら、プロジェクトのプロパティを開いて「構成プロパティ→リンカー→入力→モジュール定義ファイル」に「CppDll.def」を設定するんだ。<br/>はじめに…参考サイトにも書かれていますがログの出力先を、一般的な場所に変更します。(DebugとReleaseでそれぞれ設定する必要があるんだよ。)<br/>[[ファイル:CShapeToCppDll-002.jpg]]<br/>
変更前== DLLのコード ===== ヘッダーファイル(*.h) ===<syntaxhighlight lang="textcpp">log file = /usr/local/samba/var/log.%m</syntaxhighlight>#ifndef DLLAPI#define DLLAPI extern "C" __declspec(dllimport)#endif
変更後DLLAPI long __stdcall _Sum(const long p_Number1, const long p_Number2);<syntaxhighlight lang="text">log file = /var/log/samba/%m.log</syntaxhighlight>
== とりあえず書いてある通りに設定してみる =コードファイル(*.cpp) ==== ワークグループの設定 ==<syntaxhighlight lang="cpp">「workgroup」に「WORKGROUP」を設定します。#define DLLAPI
=== ホームディレクトリの設定 ===「valid users = %S」だけ書かれていないので追記します。<syntaxhighlight lang=#include "textCppDll.h">[homes] comment = Home Directories browseable = no writable = yes valid users = %S</syntaxhighlight>ちなみに…「%S」ですが、ユーザーIDが入るようです。<br/>で「valid users」は許可するユーザーなので…<br/>みんな許可するってことになるかと思います。
=== サービスの起動 ===DLLAPI long __stdcall _Sum(const long p_Number1, const long p_Number2)以下のコマンドで2つのサービスを起動します。{<syntaxhighlight lang="bash">systemctl start smb return p_Number1 + p_Number2;}systemctl start nmb</syntaxhighlight>
== ユーザーの追加 =モジュール定義ファイル(*.def) ===<syntaxhighlight lang="text">Sambaに接続するためのユーザーを追加します。LIBRARY CppDll
Sambaで利用するユーザーはArchLinuxのユーザーとして登録されている必要があります。EXPORTS _Sum<br/syntaxhighlight>今回は「dropbox-test」というユーザーを追加してみます。
==C♯のプロジェクト作成 = ArchLinuxにユーザーを追加 ===まず、ArchLinuxにユーザーを追加します。<syntaxhighlight lang="bash">useradd -m dropbox-test</syntaxhighlight>続けてパスワードを設定します。<syntaxhighlight lang="bash">passwd dropbox-test</syntaxhighlight>ほとんどそのまま作るんだけど…ソリューションのコンパイル対策をしておくよ。
=== ビルドイベントの設定 ===
C++のDLLはソリューションフォルダ直下の「Debug」や「Release」フォルダにDLLが格納されてしまうんだ。そうすると、デバッグするときにDLLが見つからないので、ビルドイベントを使ってコピーしてしまうよ。以下のように設定してね。(「Release」コンパイルするまでは「Release」フォルダがないのでコメントアウトしているよ)<br/>
[[ファイル:CShapeToCppDll-004.jpg]]<br/>
これで、Smabaのユーザーを登録する準備が整いました。=== プロジェクトの依存関係の設定 ===コピーするにもちゃんとリコンパイルされた資源をコピーしないといけないので、プロジェクトの依存関係を設定することで、ビルドの順番を設定するよ。<Br/>ソリューションエクスプローラーからC♯のプロジェクトを右クリックして「ビルド依存関係」→「プロジェクト依存関係」を選択してね。<br/>「依存関係」タブの依存先にC++のプロジェクトが表示されているはずだから、チェックを入れてOKボタンをクリックしてね。
==C♯のコード = Sambaにユーザーを追加 =MVVMモデルでサンプルを作ったからビューモデルが入っているけど…DLLを呼ぶには必要ないから無視してね。=== モデル ===引き続き、以下のコマンドでSambaにユーザーを登録します。<syntaxhighlight lang="bashC#">pdbedit -a -u dropbox-test</syntaxhighlight>「-a」はユーザーの追加、「-u」はユーザー名を指定する、という意味です。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;
登録したときに以下のようなメッセージが表示されれば成功です。<syntaxhighlight lang="text">Unix username: dropbox-test//追加NT username: Account Flags: [U ]User SID: S-1-5-21-3457465057-3604410224-1916174006-1000Primary Group SID: S-1-5-21-3457465057-3604410224-1916174006-513Full Name: Home Directory: \\archlinux\dropbox-testHomeDir Drive: Logon Script: Profile Path: \\archlinux\dropbox-test\profileDomain: ARCHLINUXAccount desc: Workstations: Munged dial: Logon time: 0Logoff time: 木, 07 2月 2036 00:06:39 JSTKickoff time: 木, 07 2月 2036 00:06:39 JSTPassword last set: 金, 05 7月 2019 14:51:27 JSTPassword can change: 金, 05 7月 2019 14:51:27 JSTPassword must change: neverLast bad password : 0Bad password count : 0Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</syntaxhighlight>using System.Runtime.InteropServices;
= 接続 =namespace CSharpToCDLL{ /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { /// <summary>== Windowsの場合 == /// DLLの関数定義ホームディレクトリの設定しかしていませんが…Windowsから接続してみます。 /// <br/summary>エクスプローラーのアドレス欄に、サーバーのIPアドレスを入力します。 /// <param name="p_Number1">数値1<br/param>すると、以下の様にIDとパスワードを聞かれます。 /// <param name="p_Number2">数値2<br/param>(画面がWindows10では無いですが…) /// <returns>合計<br/returns> [[ファイル:archlinux-samba-001DllImport("CppDll.png | 400px]dll")] private extern static Int32 _Sum(Int32 p_Number1,Int32 p_Number2);
Samba用に登録したユーザーIDとパスワードを入力します。 /// <summary> /// 標準のコンストラクタ /// <br/summary>ログインすると、ユーザーIDと同じ名前の共有フォルダがあるかと思います。 public MainWindow() { InitializeComponent(); }
入れれば成功です。念のため、ファイルやディレクトリの作成・削除をしてみてください。 /// <summary> /// ボタンクリックイベントハンドラ /// </summary> /// <param name="sender">イベント送信元</param> /// <param name="e">イベント情報</param> private void Button_Click(object sender, RoutedEventArgs e) { //DLLの関数を呼び出す Int32 l_Result = _Sum(300, 500);
== Linuxの場合 ===== コマンド接続 ===クライアント側で以下のコマンドを実行します。<syntaxhighlight lang="bash">mkdir /mnt/Homes計算結果の表示mount MessageBox.cifs -o username=[userid],password=[password],iocharset=utf8,rw,vers=3Show("計算結果:" + l_Result.0 //[ip address]/Homes /mnt/HomesToString()); } }}</syntaxhighlight>
=== 起動時接続 ビュー ===「nano」等のエディタで「<source lang="xml"><Window x:Class="CSharpToCDLL.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="77.056" Width="525"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="5"/etc> <RowDefinition Height="24"/fstab」を以下の行を追記します。> <syntaxhighlight langRowDefinition/> <RowDefinition Height="5"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="bash5"/> <ColumnDefinition/> <ColumnDefinition Width="5"/[ip address]> <ColumnDefinition Width="75"/Homes > <ColumnDefinition Width="5"/mnt> </Homes cifs usernameGrid.ColumnDefinitions> <Label Grid.Row=[userid],password"1" Grid.Column=[password],iocharset"1" Content=utf8,rw,x-systemd"{Binding Label_Content}"/> <Button Grid.Row="1" Grid.automount,_netdev,versColumn="3.0 0 2" Content="実行" Click="Button_Click"/> </Grid></Window></syntaxhighlightsource>=== ビューモデル ===<source lang="csharp">using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;
= 任意のディレクトリを共有 =今度は任意のディレクトリを共有してみます。<br/>共有するディレクトリは「/mnt/Dropbox」ですwww。<br/>追加ドロップボックスのディレクトリを共有します。using System.ComponentModel;
== 共有ディレクトリの作成 ==namespace CSharpToCDLLまぁ書くほどのことは無いですが…{ class MainWindowViewModel : INotifyPropertyChanged { /// <syntaxhighlight lang="bash"summary>mkdir /mnt/Dropbox</syntaxhighlight>ラベル表示用変数でディレクトリを作成します。<br />また、所有者を以下のコマンドで「dropbox-test」に変更します。<syntaxhighlight lang="bash">chown dropbox-test:dropbox-test /mnt/Dropbox</syntaxhighlightsummary> private String m_Label_Content;
== 共有設定 == /// <summary> /// ラベル表示文字列先ほどと同じく「 /etc/samba/smb.conf」を編集していきます。<br/summary>ファイルの最後に以下を追記します。 public String Label_Content { set<syntaxhighlight lang { this.m_Label_Content =value; this.OnPropertyChanged("textLabel_Content">[Dropbox]); comment = Dropbox Directory } path = /mnt/Dropbox writable = yes get { return this.m_Label_Content; } valid users = dropbox-test</syntaxhighlight> }
== サービスの読み込み直し ==以下のコマンドで読み込み直します。 /// <syntaxhighlight lang="bash"summary>systemctl reload smbsystemctl reload nmb /// プロパティ変更イベントハンドラ /// </syntaxhighlightsummary> public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// プロパティ変更通知
/// </summary>
/// <param name="p_PropertyName">プロパティ名</param>
public void OnPropertyChanged(String p_PropertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(p_PropertyName));
}
}
}
}
</source>
 以上で、接続すると見れるかと思います。 = 参考サイト =[https[Category://wiki.archlinux.jp/index.php/Samba Samba - ArchWikiC♯]<br/>[http://www.samba.gr.jp/doc/samba2.0_and_linux.html 日本Sambaユーザ会 - SambaによるWindowsファイルサーバ構築]<br/> [[Category:ArchLinuxC++]][[Category:Sambadll]]

案内メニュー